home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 4 / Amiga Tools 4.iso / grafix / tools / playfkiss / src / playkiss.e < prev    next >
Text File  |  1996-02-26  |  60KB  |  2,052 lines

  1.  
  2. /* Play KiSS v 0.88 */
  3.  
  4. /*
  5.     No copyright is claimed for *any* material within.
  6.   This source is *currently* Public Domain, and therefore open to free exploitation. */
  7.  
  8. /* Use at your own risk, and watch for hairy palms. */
  9.  
  10.  
  11. /*  November 9, 1994
  12.                                              Chad Randall 
  13.                                                         - mbissaymssiK Software, broken spork division
  14.                         Internet:  crandall@garnet.msen.com
  15.                             USNail:  229 S.Washington St.
  16.                                              Manchester, Michigan, 48158-9680 USA */
  17.  
  18. /* This sucker's not been tested but on my machine.  So let me know about any probs, 'kay? */
  19.  
  20. OPT LARGE
  21.  
  22. MODULE    'graphics/rastport','graphics/gfx','graphics/text','graphics/scale','graphics/view',
  23.                 'graphics/gfxbase','graphics/clip','graphics/layers','graphics/displayinfo'
  24. MODULE    'layers'
  25. MODULE    'intuition/intuition','intuition/screens','intuition/gadgetclass','intuition/screens',
  26.                 'intuition/pointerclass'
  27. MODULE    'libraries/gadtools','gadtools'
  28. MODULE    'dos/dos'
  29. MODULE    'libraries/asl','asl'
  30. MODULE    'tools/async'
  31. MODULE    'wb','workbench/workbench','workbench/startup'
  32. MODULE    'icon'
  33. MODULE    'exec/memory','exec/lists','exec/nodes'
  34. MODULE    'utility/tagitem'
  35.  
  36. MODULE    'amigalib/lists'
  37.  
  38. MODULE    'mod/pool'
  39.  
  40. CONST    GS1_SIZE_X=640,GS2_SIZE_X=640,GS3_SIZE_X=640,GS4_SIZE_X=768
  41. CONST    GS1_SIZE_Y=400,GS2_SIZE_Y=400,GS3_SIZE_Y=480,GS4_SIZE_Y=512
  42. CONST    GS1_MAX_COLOR=16,GS2_MAX_COLOR=256,GS3_MAX_COLOR=256,GS4_MAX_COLOR=256
  43. CONST    GS1_MAX_CELL=128,GS2_MAX_CELL=192,GS3_MAX_CELL=256,GS4_MAX_CELL=256
  44. CONST SIZE_X_218=448,SIZE_Y_218=320,SIZE_X_224C=640,SIZE_Y_224C=400
  45. CONST FILE_MARK_CELL=$20,FILE_MARK_PALET=$10
  46. CONST DEFAULT_SIKII_DITHER=36
  47. CONST DEFAULT_SIKII_GOSA=1300
  48. CONST DEFAULT_COEF_GOSA=25
  49. CONST MAX_CELL=600
  50. CONST MAX_SET=10,MAX_PAL=10,MAX_COLOR=GS4_MAX_COLOR
  51. CONST MAX_SIZE_X=GS4_SIZE_X,MAX_SIZE_Y=GS4_SIZE_Y
  52. CONST DEFAULT_SIZE_X=SIZE_X_218,DEFAULT_SIZE_Y=SIZE_Y_218
  53. CONST FILENAME_LENGTH=64
  54.  
  55. ENUM OLD_,NEW_
  56. ENUM    DRAG_TOP,DRAG_PAUSE,DRAG_DIRTY,DRAG_BUFFER,DRAG_SMART
  57. CONST    CACHE_CHIP=0,CACHE_FAST=1,CACHE_NONEED=5,CACHE_NEED=6,CACHE_CHECK=7
  58.  
  59. OBJECT gcmap
  60.     red[256]:ARRAY OF CHAR
  61.     grn[256]:ARRAY OF CHAR
  62.     blu[256]:ARRAY OF CHAR
  63. ENDOBJECT
  64.  
  65. OBJECT cello
  66.     xsize,ysize:INT
  67.     xoffset,yoffset:INT
  68.     mark:INT
  69.     fix:INT
  70.     cache:INT
  71.     palet_num:CHAR
  72.     bit_per_pixel:CHAR
  73.     catch:LONG
  74.     setxy:PTR TO setxy
  75.         pix:PTR TO bitmap
  76.     pix_rp:PTR TO rastport
  77.     clip_pix:PTR TO bitmap
  78.     clip_pix_rp:PTR TO rastport
  79.     name:LONG
  80.     catchsize:LONG
  81. ENDOBJECT
  82.  
  83. OBJECT setxy
  84.     set[MAX_SET]:ARRAY OF CHAR
  85.     x[MAX_SET]:ARRAY OF INT
  86.     y[MAX_SET]:ARRAY OF INT
  87. ENDOBJECT    
  88.  
  89. OBJECT paleto
  90.     name[FILENAME_LENGTH]:ARRAY OF CHAR
  91.     format:CHAR
  92.     palet_num:CHAR
  93.     bit_per_pixel:CHAR
  94.     color_num:INT
  95.     pb[MAX_PAL]:ARRAY OF INT
  96.     color[18]:ARRAY OF LONG
  97. ENDOBJECT
  98.  
  99. OBJECT color
  100.     red:LONG
  101.     green:LONG
  102.     blue:LONG
  103. ENDOBJECT
  104.  
  105. OBJECT objnode
  106.     ln:ln
  107.     cels:PTR TO LONG
  108.     x:INT
  109.     y:INT
  110. ENDOBJECT
  111.  
  112. OBJECT celnode
  113.     ln:ln
  114.     ox:INT
  115.     oy:INT
  116.     w:INT
  117.     h:INT
  118.     bm:PTR TO bitmap
  119.     cd:PTR TO CHAR
  120. ENDOBJECT
  121.  
  122. ENUM SCAN_NORMAL, SCAN_EOL, SCAN_SETDATA, SCAN_IBM, SCAN_CEL, SCAN_CELNUM, SCAN_CELNAME, SCAN_CELNEXT
  123.  
  124. DEF filename[500]:STRING
  125.  
  126. DEF vp:PTR TO viewport,cm,depth,scrw,scrh,menu,vis
  127. DEF rp:PTR TO rastport,winw,winh
  128.  
  129. DEF quit=FALSE,newproj=FALSE
  130. DEF mode=0
  131. DEF config_size_x,config_size_y
  132. DEF cell[MAX_CELL]:ARRAY OF cello
  133. DEF palet[20]:ARRAY OF paleto
  134.  
  135. DEF objlist:PTR TO lh
  136. DEF cellist:PTR TO lh
  137. DEF mempool=0
  138.  
  139. DEF highcell=0
  140. DEF barh=8
  141. DEF pb[MAX_SET]:LIST
  142. DEF current_palet=0
  143. DEF current_set=0
  144. DEF disp:PTR TO rastport
  145. DEF scr:PTR TO screen
  146. DEF win:PTR TO window,outwin:PTR TO window
  147. DEF fixxed=FALSE,fixpow=0,fixpower=0,rtdrag=DRAG_TOP,waittof=TRUE,hand=FALSE,bound=TRUE
  148. DEF string[500]:STRING
  149. DEF iconbmap=0:PTR TO bitmap,iconwidth,iconheight,oldx,oldy
  150. DEF copybmap=0:PTR TO bitmap,copyrast:PTR TO rastport
  151. DEF backbmap=0:PTR TO bitmap,backrast:PTR TO rastport
  152. DEF maskbmap=0:PTR TO bitmap
  153. DEF blankbmap=0:PTR TO bitmap,maximumw=1,maximumh=1
  154. DEF hand1=0,hand2=0,hand3=0
  155. DEF curobj=0,offx,offy,dragmode=0,origx,origy
  156. DEF filereq=0:PTR TO filerequester
  157. DEF modeid=0,sh=400,sw=640
  158. ENUM OFF=FALSE,ON=TRUE
  159. DEF outputmode=0
  160. DEF pauseflag=FALSE
  161. RAISE "CHIP" IF AllocBitMap()=FALSE
  162. RAISE "MEM" IF AllocMem()=FALSE
  163. RAISE "MEM" IF New()=FALSE
  164. RAISE "^C" IF CtrlC()=TRUE
  165.  
  166. PROC check_str(str)
  167.     DEF p
  168.     p:=str;WHILE (Char(p)<>0)
  169.         IF ((Char(p)=10) OR (Char(p)=13) OR (Char(p)=9)) THEN PutChar(p," ")
  170.         IF (Char(p)=";")
  171.             PutChar(p,0)
  172.         ENDIF
  173.         EXIT (Char(p)=";")
  174.     p:=p+1;ENDWHILE
  175. ENDPROC
  176.  
  177. versionstring:
  178. CHAR    '\0$VER: playkiss 0.88 (21.11.94) \tPUBLIC DOMAIN --- NOT FOR RESALE\0\0'
  179.  
  180. /*PROC skip_str(str) ->char *skip_str(char *str)
  181.     DEF p                                                                                        ->       char *p;
  182.     p:=str;WHILE (Char(p)=" ");p:=p+1;ENDWHILE             ->        for (p=str;*p==' ';p++);
  183.   WHILE (Char(p)<>" ")                                                        ->        for (;*p!=' ';p++)
  184.         IF (Char(p)=0) THEN RETURN p                                    ->    if (*p=='\0') return(p);
  185.     p:=p+1;ENDWHILE
  186.     WHILE (Char(p)=" ");p:=p+1;ENDWHILE                            ->    for (;*p==' ';p++);
  187.   RETURN p
  188. ENDPROC*/
  189.  
  190. PROC check_kiss_header(fp)
  191.     DEF buf
  192.     buf:=[0,0,0,0]:LONG
  193.     Read(fp,buf,4)
  194.     Seek(fp,0,OFFSET_BEGINNING)
  195.     IF Long(buf)="KiSS" THEN RETURN 1
  196. ENDPROC FALSE
  197.  
  198.  
  199. PROC load_data_cell(fn,num) HANDLE
  200.     DEF fh=0
  201.     DEF buf[64]:ARRAY OF CHAR,tmp_buf
  202.     DEF i,t,j,x,y,flag
  203.     DEF b[MAX_SIZE_X]:ARRAY OF CHAR
  204.     DEF dir[500]:STRING,oldfile[100]:STRING
  205.     DEF nx=0,ny=0,p,nrp=0
  206.  
  207.     DEF ob=0:PTR TO CHAR,nb=0:PTR TO CHAR    
  208.  
  209.     DEF temprp=0:PTR TO rastport
  210.     DEF array=0
  211.     DEF tempbitmap=0:PTR TO bitmap
  212.  
  213.     DEF charptr=0:PTR TO CHAR
  214.     DEF cp2=0
  215.     DEF cs1=0:PTR TO CHAR
  216.     DEF cs2=0:PTR TO CHAR
  217.     DEF cs=0:PTR TO CHAR
  218.  
  219.     highcell:=bigger(num,highcell)
  220.     splitname(filename,dir,oldfile)
  221.     AddPart(dir,fn,490)
  222.     fh:=as_Open(dir,MODE_OLDFILE,6,4000)
  223.     IF fh
  224.         as_Read(fh,buf,4)
  225.         IF Long(buf)="KiSS"
  226.             as_Read(fh,buf,28)
  227.             IF Char(buf)<>FILE_MARK_CELL THEN Raise("|cel")
  228.             cell[num].xsize:=((Char(buf+ 5)*256)+Char(buf+ 4))
  229.             cell[num].ysize:=(Char(buf+7)*256)+Char(buf+6)
  230.             cell[num].xoffset:=Char(buf+9)*256+Char(buf+8)
  231.             cell[num].yoffset:=Char(buf+11)*256+Char(buf+10)
  232.             cell[num].bit_per_pixel:=smaller(bigger(Char(buf+1),4),8)
  233.         ELSE
  234.             cell[num].xsize:=(Char(buf+1)*256+Char(buf))
  235.             cell[num].ysize:=Char(buf+3)*256+Char(buf+2)
  236.             cell[num].xoffset:=0
  237.             cell[num].yoffset:=0
  238.             cell[num].bit_per_pixel:=4
  239.         ENDIF
  240.  
  241.         IF cell[num].bit_per_pixel=8
  242.             cell[num].pix:=AllocBitMap(cell[num].xsize,cell[num].ysize,8, BMF_INTERLEAVED OR BMF_CLEAR, NIL)
  243.             cell[num].pix_rp:=New(SIZEOF rastport)
  244.             InitRastPort(cell[num].pix_rp)
  245.             cell[num].pix_rp.bitmap:=cell[num].pix
  246.  
  247.             cell[num].clip_pix:=AllocBitMap(cell[num].xsize,cell[num].ysize,1, BMF_INTERLEAVED OR BMF_CLEAR, NIL)
  248.             cell[num].clip_pix_rp:=New(SIZEOF rastport)
  249.             InitRastPort(cell[num].clip_pix_rp)
  250.             cell[num].clip_pix_rp.bitmap:=cell[num].clip_pix
  251.             cell[num].palet_num:=0
  252.         ELSE
  253.             cell[num].pix:=AllocBitMap(cell[num].xsize,cell[num].ysize,4, BMF_INTERLEAVED OR BMF_CLEAR, NIL)
  254.             cell[num].pix_rp:=New(SIZEOF rastport)
  255.             InitRastPort(cell[num].pix_rp)
  256.             cell[num].pix_rp.bitmap:=cell[num].pix
  257.  
  258.             cell[num].clip_pix:=AllocBitMap(cell[num].xsize,cell[num].ysize,1, BMF_INTERLEAVED OR BMF_CLEAR, NIL)
  259.             cell[num].clip_pix_rp:=New(SIZEOF rastport)
  260.             InitRastPort(cell[num].clip_pix_rp)
  261.             cell[num].clip_pix_rp.bitmap:=cell[num].clip_pix
  262.         ENDIF
  263.  
  264.         temprp:=New(SIZEOF rastport)
  265.         InitRastPort(temprp)
  266.         CopyMem(cell[num].pix_rp,temprp,SIZEOF rastport)
  267.         tempbitmap:=AllocBitMap(cell[num].xsize,1,8, BMF_CLEAR,NIL)
  268.         temprp.bitmap:=tempbitmap
  269.         array:=New(cell[num].xsize+100)
  270.  
  271.  
  272. -> NEED TO OPTIMIZE THE FOLLOWING:::
  273.  
  274.         IF cell[num].bit_per_pixel=8
  275.             nx:=cell[num].xsize
  276.             nrp:=cell[num].pix_rp
  277.             FOR i:=0 TO cell[num].ysize-1
  278.  
  279.                 as_Read(fh,b,nx)
  280.  
  281.                 FOR t:=0 TO nx-1
  282.                     PutChar(array+t,Char(b+t))
  283.                 ENDFOR
  284.                 IF (nrp<>0) THEN WritePixelLine8(nrp,0,i,nx,array,temprp)
  285.             ENDFOR
  286.         ENDIF
  287.  
  288.         IF cell[num].bit_per_pixel=4
  289.             nx:=cell[num].xsize
  290.             ny:=cell[num].ysize
  291.             nrp:=cell[num].pix_rp
  292.             nb:=New(nx*2)
  293.             IF (nb)
  294.                 ob:=New(nx*ny*2)
  295.                 IF (ob)
  296.                     as_Read(fh,nb,((nx+1)/2)*ny)
  297.                     IF (nrp<>0)
  298.                         FOR i:=0 TO ny-1
  299.                             cs1:=nb
  300.                             cs2:=ob+(i*nx)
  301.                             charptr:=cs2
  302.                             FOR t:=0 TO (nx-1) STEP 2
  303.                                 cs:=cs1[0]
  304.                                 cs2[0]:=((cs*$10) AND $0F)
  305.                                 cs2[1]:=(cs AND $0F)
  306.                                 cs1:=cs1+1
  307.                                 cs2:=cs2+2
  308.                             ENDFOR
  309.                             WritePixelLine8(nrp,0,i,nx,charptr,temprp)
  310.                         ENDFOR
  311.                     ENDIF
  312.                     Dispose(ob)
  313.                 ENDIF
  314.                 Dispose(nb)
  315.             ENDIF
  316.         ENDIF
  317.  
  318.         maximumw:=bigger(maximumw,nx)
  319.         maximumh:=bigger(maximumh,cell[num].ysize)
  320.  
  321.         IF ((cell[num].pix<>0) AND (cell[num].clip_pix<>0))
  322.             planesclip(cell[num].pix,cell[num].clip_pix,cell[num].xsize,cell[num].ysize)
  323.             FOR i:=1 TO 7;PutLong(cell[num].clip_pix+8+(i*4),Long(cell[num].clip_pix+8));ENDFOR
  324.             PutChar(cell[num].clip_pix+5,8)
  325.         ENDIF
  326.     ENDIF
  327. EXCEPT DO
  328.     IF fh;as_Close(fh);ELSE
  329.         IF outwin
  330.             StringF(string,'Object not found:"\s" ',fn)
  331.             SetWindowTitles(outwin,string,-1)
  332.             DisplayBeep(0)
  333.             Delay(30)
  334.         ENDIF
  335.     ENDIF
  336.     
  337.     IF temprp THEN Dispose(temprp)
  338.     IF array THEN Dispose(array)
  339.     IF tempbitmap THEN FreeBitMap(tempbitmap)
  340.     IF exception="CHIP"
  341.         WriteF('Not enough CHIP memory.\n')
  342.         DisplayBeep(0)
  343.     ENDIF
  344.     IF exception="^C" THEN ReThrow()
  345. ENDPROC
  346.  
  347. PROC cache_cell(num,mode)  -> bitmap must be INTERLEAVED!!!  ie, *ONE* raster!!!!
  348.     DEF newmode=CACHE_NONEED,plane:PTR TO bitmap
  349.     IF (mode=CACHE_CHECK)
  350.         IF (cell[num].setxy.set[current_set]<10)
  351.             newmode:=CACHE_NEED
  352.         ENDIF
  353.     ENDIF
  354.     IF mode=CACHE_NEED THEN newmode:=CACHE_NEED
  355.     IF (newmode=CACHE_NONEED)
  356.         IF (cell[num].cache=CACHE_CHIP)
  357.             IF cell[num].pix=0 THEN RETURN
  358.             cell[num].catchsize:=(cell[num].pix.bytesperrow*cell[num].pix.rows)
  359.             cell[num].catch:=AllocMem(cell[num].catchsize,MEMF_ANY)
  360.             CopyMem(Long(cell[num].pix+8),cell[num].catch,cell[num].catchsize)
  361.             FreeBitMap(cell[num].pix);cell[num].pix:=0
  362.             cell[num].cache:=CACHE_FAST
  363.         ENDIF
  364.     ENDIF
  365.     IF (newmode=CACHE_NEED)
  366.         IF (cell[num].cache=CACHE_FAST)
  367.             IF cell[num].bit_per_pixel=8
  368.                 cell[num].pix:=AllocBitMap(cell[num].xsize,cell[num].ysize,8, BMF_INTERLEAVED OR BMF_CLEAR, NIL)
  369.             ELSE
  370.                 cell[num].pix:=AllocBitMap(cell[num].xsize,cell[num].ysize,4, BMF_INTERLEAVED OR BMF_CLEAR, NIL)
  371.             ENDIF
  372.             cell[num].pix_rp.bitmap:=cell[num].pix
  373.             IF (cell[num].catch<>0)
  374.                 IF (cell[num].pix<>0)
  375.                     CopyMem(cell[num].catch,Long(cell[num].pix+8),cell[num].catchsize)
  376.                     FreeMem(cell[num].catch,cell[num].catchsize);cell[num].catch:=0
  377.                 ELSE
  378.                     WriteF('nopix?!!!? \n');DisplayBeep(0)
  379.                 ENDIF
  380.             ELSE
  381.                 WriteF('nomem???!? \n');DisplayBeep(0)
  382.             ENDIF
  383.             cell[num].cache:=CACHE_CHIP
  384.         ENDIF
  385.     ENDIF            
  386. ENDPROC
  387.  
  388. PROC disposesaveback()
  389.     DEF i
  390.     IF iconbmap THEN FreeBitMap(iconbmap)
  391.     IF copybmap THEN FreeBitMap(copybmap)
  392.     IF backbmap THEN FreeBitMap(backbmap)
  393.     IF backrast THEN Dispose(backrast)
  394.     IF copyrast THEN Dispose(copyrast)
  395.     IF maskbmap
  396.         PutChar(maskbmap+5,1)
  397.         FOR i:=1 TO 7;PutLong(maskbmap+8+(i*4),0);ENDFOR
  398.         FreeBitMap(maskbmap)
  399.     ENDIF
  400.     iconbmap:=0;backbmap:=0;maskbmap:=0;copybmap:=0;backrast:=0;copyrast:=0
  401. ENDPROC
  402.  
  403. PROC createsaveback(obj)
  404.     DEF i,minw=16,minh=8,dummy,mask
  405.     disposesaveback()
  406.     FOR i:=0 TO MAX_CELL-1
  407.         IF cell[i].mark=obj
  408.             minw:=bigger(minw,cell[i].xoffset+cell[i].xsize+1)
  409.             minh:=bigger(minh,cell[i].yoffset+cell[i].ysize+1)
  410.         ENDIF
  411.     ENDFOR
  412.     iconwidth:=minw
  413.     iconheight:=minh
  414.     iconbmap:=AllocBitMap(minw,minh,retdepth(mode), BMF_CLEAR OR IF (rtdrag<DRAG_DIRTY) THEN BMF_INTERLEAVED ELSE 0,NIL)
  415.     IF ((rtdrag=DRAG_BUFFER) OR (rtdrag=DRAG_SMART))
  416.         IF (((rtdrag=DRAG_SMART) AND (minw<160) AND (minh<280)) OR (rtdrag=DRAG_BUFFER))
  417.             copybmap:=AllocBitMap(minw,minh,retdepth(mode), BMF_INTERLEAVED,NIL)
  418.             copyrast:=New(SIZEOF rastport)
  419.             InitRastPort(copyrast)
  420.             copyrast.bitmap:=copybmap
  421.         ENDIF
  422.     ENDIF
  423.     backbmap:=AllocBitMap(minw,minh,retdepth(mode), BMF_INTERLEAVED,NIL)
  424.     backrast:=New(SIZEOF rastport)
  425.     InitRastPort(backrast)
  426.     backrast.bitmap:=backbmap
  427.     maskbmap:=AllocBitMap(minw,minh,1,IF (rtdrag=FALSE) THEN  BMF_INTERLEAVED ELSE 0,NIL)
  428.  
  429.     FOR i:=MAX_CELL-1 TO 0 STEP -1
  430.         IF (cell[i].mark=obj)
  431.             IF (cell[i].setxy.set[current_set]<10)
  432.                 IF ((cell[i].clip_pix<>0) AND (iconbmap<>0)) THEN BltBitMap(cell[i].clip_pix,0,0,iconbmap,cell[i].xoffset,cell[i].yoffset,cell[i].xsize,cell[i].ysize,$20,$FFFFFFFF,0)
  433.                 IF ((cell[i].pix<>0) AND (iconbmap<>0)) THEN BltBitMap(cell[i].pix,0,0,iconbmap,cell[i].xoffset,cell[i].yoffset,cell[i].xsize,cell[i].ysize,$E0,$FFFFFFFF,0)
  434.                 dummy:=cell[i].palet_num
  435.                 SELECT dummy
  436.                     CASE 0 ;mask:=%00000000
  437.                     CASE 1 ;mask:=%00010000
  438.                     CASE 2 ;mask:=%00100000
  439.                     CASE 3 ;mask:=%00110000
  440.                     CASE 4 ;mask:=%01000000
  441.                     CASE 5 ;mask:=%01010000
  442.                     CASE 6 ;mask:=%01100000
  443.                     CASE 7 ;mask:=%01110000
  444.                     CASE 8 ;mask:=%10000000
  445.                     CASE 9 ;mask:=%10010000
  446.                     CASE 10;mask:=%10100000
  447.                     CASE 11;mask:=%10110000
  448.                     CASE 12;mask:=%11000000
  449.                     CASE 13;mask:=%11010000
  450.                     CASE 14;mask:=%11100000
  451.                     CASE 15;mask:=%11110000
  452.                 ENDSELECT
  453.                 dummy:=retdepth(mode)
  454.                 SELECT dummy
  455.                     CASE 4;mask:=(mask AND %00000000)
  456.                     CASE 5;mask:=(mask AND %00010000)
  457.                     CASE 6;mask:=(mask AND %00110000)
  458.                     CASE 7;mask:=(mask AND %01110000)
  459.                     CASE 8;mask:=(mask AND %11110000)
  460.                 ENDSELECT
  461.                 IF ((cell[i].clip_pix<>0) AND (iconbmap<>0)) THEN BltBitMap(cell[i].clip_pix,0,0,iconbmap,cell[i].xoffset,cell[i].yoffset,cell[i].xsize,cell[i].ysize,$E0,mask,0)
  462.             ENDIF
  463.         ENDIF            
  464.     ENDFOR
  465.  
  466.     planesclip(iconbmap,maskbmap,iconwidth,iconheight)
  467.     PutChar(maskbmap+5,8)
  468.     FOR i:=1 TO 7;PutLong(maskbmap+8+(i*4),Long(maskbmap+8));ENDFOR
  469.  
  470. ENDPROC
  471.  
  472. PROC reportmousemoves(win:PTR TO window)
  473.     Forbid()
  474.     win.flags:=win.flags OR WFLG_REPORTMOUSE
  475.     Permit()
  476. ENDPROC
  477. PROC noreportmousemoves(win:PTR TO window);DEF flag
  478.     Forbid()
  479.     flag:=win.flags
  480.     IF (flag AND WFLG_REPORTMOUSE) THEN flag:=flag-WFLG_REPORTMOUSE
  481.     win.flags:=flag
  482.     Permit()
  483. ENDPROC
  484.  
  485.  
  486. PROC main() HANDLE
  487.     DEF i,ii,t,zz,tt,zzz
  488.     DEF mes:PTR TO intuimessage
  489.     DEF hit,hitflag=0,iadd:PTR TO menuitem,drawx,drawy
  490.     DEF dir[500]:STRING,file[250]:STRING,buffer
  491.     DEF args:PTR TO wbarg,wstr[250]:STRING,toolobject=NIL:PTR TO diskobject
  492.     DEF region1,rectangle:PTR TO rectangle
  493.     DEF olddir,dirrr,wb:PTR TO wbstartup
  494.     DEF argarray[32]:LIST,rdarg=0,gotme=0,check,code=0,du=0
  495.     DEF zx,zy,zw,zh,zox,zoy
  496.     DEF oldfh=0,newfh=0,filebuf=0,bufptr,filelen=1
  497.     DEF menuverify=FALSE
  498.  
  499.     IF (KickVersion(39)=0)
  500.         Raise("Kick")
  501.     ENDIF
  502.  
  503.     buffer:=New(260*12)
  504.     IF (iconbase:=OpenLibrary('icon.library', 37))=NIL THEN Raise("LIB")
  505.     IF (aslbase:=OpenLibrary('asl.library', 37))=NIL THEN Raise("LIB")
  506.     IF (gadtoolsbase:=OpenLibrary('gadtools.library',37))=NIL THEN Raise("LIB")
  507.     IF (layersbase:=OpenLibrary('layers.library',37))=NIL THEN Raise("LIB")
  508.  
  509.     NEW cell[MAX_CELL]
  510.     FOR i:=0 TO MAX_CELL-1
  511.         cell[i].setxy:=New(SIZEOF setxy)
  512.     ENDFOR
  513.     NEW palet[16]
  514.     NEW rectangle
  515.  
  516.     NEW objlist
  517.     NEW cellist
  518.  
  519.     newList(objlist)
  520.     newList(cellist)
  521.  
  522.     IF wbmessage<>NIL
  523.         outputmode:=TRUE
  524.         wb:=wbmessage;args:=wb.arglist
  525.         olddir:=CurrentDir(args.lock)
  526.         IF args.name>0
  527.             GetCurrentDirName(wstr,250)
  528.             StrCopy(filename,wstr,ALL);AddPart(filename,'',490)
  529.             StrAdd(wstr,args.name,ALL)
  530.             IF (toolobject:=GetDiskObjectNew(wstr))
  531.                 IF (du:=FindToolType(toolobject.tooltypes,'DRAG_STRENGTH'))
  532.                     StrToLong(du,{fixpow})
  533.                     fixpow:=limit(fixpow,0,9)
  534.                 ENDIF
  535.                 IF (du:=FindToolType(toolobject.tooltypes,'FIXED'))
  536.                     IF MatchToolValue(du,'yes');fixxed:=FALSE;fixpow:=0;ELSE;fixxed:=TRUE;fixpow:=9;ENDIF
  537.                 ENDIF
  538.                 IF (du:=FindToolType(toolobject.tooltypes,'KISS_DIRECTORY'))
  539.                     StrCopy(filename,du,ALL)
  540.                     AddPart(filename,'',490)
  541.                 ENDIF
  542.                 IF (du:=FindToolType(toolobject.tooltypes,'HANDPOINTER'))
  543.                     IF MatchToolValue(du,'yes');hand:=TRUE;ELSE;hand:=FALSE;ENDIF
  544.                 ENDIF
  545.                 IF (du:=FindToolType(toolobject.tooltypes,'BLANKPOINTER'))
  546.                     IF MatchToolValue(du,'yes');hand:=3;ENDIF
  547.                 ENDIF
  548.                 IF (du:=FindToolType(toolobject.tooltypes,'BOUNDS'))
  549.                     IF MatchToolValue(du,'no');bound:=FALSE;ELSE;bound:=TRUE;ENDIF
  550.                 ENDIF
  551.                 IF (du:=FindToolType(toolobject.tooltypes,'DRAGTYPE'))
  552.                     StrToLong(du,{rtdrag})
  553.                     du:=limit(du,DRAG_TOP,DRAG_SMART)
  554.                 ENDIF
  555.                 IF (du:=FindToolType(toolobject.tooltypes,'MODEID'))
  556.                     IF Char(du)<>"$"
  557.                         StrToLong(du,{modeid})
  558.                     ELSE
  559.                         modeid:=hex2int(du)
  560.                     ENDIF
  561.                 ENDIF
  562.                 IF (du:=FindToolType(toolobject.tooltypes,'SCREEN_WIDTH'))
  563.                     StrToLong(du,{sw})
  564.                 ENDIF
  565.                 IF (du:=FindToolType(toolobject.tooltypes,'SCREEN_HEIGHT'))
  566.                     StrToLong(du,{sh})
  567.                 ENDIF
  568.                 IF (du:=FindToolType(toolobject.tooltypes,'WAITBLITTER'))
  569.                     IF MatchToolValue(du,'no');waittof:=FALSE;ELSE;waittof:=TRUE;ENDIF
  570.                 ENDIF
  571.                 FreeDiskObject(toolobject)
  572.             ENDIF
  573.         ENDIF
  574.         CurrentDir(olddir)
  575.  
  576. ->        StrCopy(filename,wstr,ALL)
  577.         IF wb.numargs>1
  578.             olddir:=args[].lock++ ->skip our lock! olddir is meaningless at this point
  579.             IF args.lock
  580.                 olddir:=CurrentDir(args.lock)
  581.                 GetCurrentDirName(filename,490)
  582.                 NameFromLock(args.lock,wstr,240)
  583.                 CurrentDir(olddir)
  584.                 AddPart(filename,args.name,490)
  585.                 gotme:=TRUE
  586.             ENDIF
  587.         ENDIF
  588.     ELSE
  589.         FOR i:=0 TO 30
  590.             argarray[i]:=NIL
  591.         ENDFOR
  592.         rdarg:=ReadArgs('FILE,M=MODEID/K,SW=SCREENWIDTH/N/K,SH=SCREENHEIGHT/N/K,D=DRAGMODE/N/K,DS=DRAGSTRENGTH/B/K,X=NOFIX/S,H=HAND/S,BP=BLANKPTRP/S,NWB=NOWAITBLIT/S,NOB=NOBOUNDS/S',argarray,0)
  593.         IF rdarg
  594.             IF argarray[0]
  595.                 StrCopy(filename,argarray[0],ALL)
  596.                 gotme:=TRUE
  597.             ENDIF
  598.             IF argarray[1]
  599.                 IF (Char(argarray[1])<>"$")
  600.                     StrToLong(argarray[1],{modeid})
  601.                 ELSE
  602.                     modeid:=hex2int(argarray[1])
  603.                 ENDIF
  604.             ENDIF
  605.             IF argarray[2]
  606.                 sw:=argarray[2]
  607.                 sw:=^sw
  608.             ENDIF
  609.             IF argarray[3]
  610.                 sh:=argarray[3]
  611.                 sh:=^sh
  612.             ENDIF
  613.             IF argarray[4]
  614.                 rtdrag:=argarray[4]
  615.                 rtdrag:=^rtdrag
  616.                 rtdrag:=limit(rtdrag,DRAG_TOP,DRAG_SMART)
  617.             ENDIF
  618.             IF argarray[5]
  619.                 fixpow:=argarray[5]
  620.                 fixpow:=^fixpow
  621.                 fixpow:=limit(fixpow,0,9)
  622.             ENDIF
  623.             IF argarray[6];fixxed:=TRUE;fixpow:=9;ENDIF
  624.             IF argarray[7] THEN hand:=TRUE
  625.             IF argarray[8] THEN hand:=3
  626.             IF argarray[9] THEN waittof:=FALSE
  627.             IF argarray[10] THEN bound:=FALSE
  628.             FreeArgs(rdarg)
  629.         ENDIF
  630.     ENDIF
  631.  
  632.     FOR i:=0 TO MAX_CELL-1
  633.         cell[i].name:=String(FILENAME_LENGTH)
  634.         cell[i].mark:=-66
  635.         cell[i].cache:=0
  636.         cell[i].pix:=0
  637.         cell[i].clip_pix:=0
  638.     ENDFOR
  639.     FOR i:=0 TO 15
  640.         FOR ii:=0 TO 15
  641.             palet[i].color[ii]:=0
  642.         ENDFOR
  643.     ENDFOR
  644.  
  645.     PutLong({hand1bm}+8,{hand1dataa})
  646.     PutLong({hand1bm}+12,{hand1datab})
  647.     PutLong({hand2bm}+8,{hand2dataa})
  648.     PutLong({hand2bm}+12,{hand2datab})
  649.     PutLong({hand3bm}+8,{hand3dataa})
  650.     PutLong({hand3bm}+12,{hand3datab})
  651.     hand1:=NewObjectA(NIL,'pointerclass',[POINTERA_BITMAP,{hand1bm},
  652.                             POINTERA_XOFFSET,-7,
  653.                             POINTERA_YOFFSET,0,
  654.                             POINTERA_XRESOLUTION,POINTERXRESN_SCREENRES,
  655.                             POINTERA_YRESOLUTION,POINTERYRESN_SCREENRESASPECT,
  656.                             NIL,NIL])
  657.     hand2:=NewObjectA(NIL,'pointerclass',[POINTERA_BITMAP,{hand2bm},
  658.                             POINTERA_XOFFSET,-7,
  659.                             POINTERA_YOFFSET,1,
  660.                             POINTERA_XRESOLUTION,POINTERXRESN_SCREENRES,
  661.                             POINTERA_YRESOLUTION,POINTERYRESN_SCREENRESASPECT,
  662.                             NIL,NIL])
  663.     hand3:=NewObjectA(NIL,'pointerclass',[POINTERA_BITMAP,{hand3bm},
  664.                             POINTERA_XRESOLUTION,POINTERXRESN_HIRES,
  665.                             POINTERA_YRESOLUTION,POINTERYRESN_HIGH,
  666.                             POINTERA_XOFFSET,0,
  667.                             POINTERA_YOFFSET,0,
  668.                             NIL,NIL])
  669.  
  670.  
  671.     filereq:=AllocAslRequest(ASL_FILEREQUEST,[ASLFR_INITIALPATTERN,'#?.CNF',NIL,NIL])
  672.  
  673.     region1:=NewRegion()
  674.  
  675.     WHILE quit=FALSE
  676.         IF (gotme<>TRUE)
  677.             splitname(filename,dir,file)
  678.             WbenchToFront()
  679.             ii:=AslRequest(filereq,[ASL_HAIL,'Select .CNF file',
  680.                                 ASL_OKTEXT,'Open',ASL_FILE,file,ASL_DIR,dir,
  681.                                 ASLFR_DOPATTERNS,TRUE,ASLFR_DOSAVEMODE,FALSE,FILF_NEWIDCMP,TRUE,NIL,NIL])
  682.             IF ii
  683.                 StrCopy(filename,filereq.drawer,ALL)
  684.                 AddPart(filename,filereq.file,490)
  685.             ELSE
  686.                 quit:=TRUE;StrCopy(filename,'',ALL)
  687.             ENDIF
  688.         ENDIF    ;gotme:=FALSE
  689.         mode:=0
  690.         maximumw:=1;maximumh:=1
  691.         scr:=LockPubScreen('Workbench')
  692.         config_size_x:=scr.width
  693.         config_size_y:=(scr.height)
  694.         IF sw THEN config_size_x:=sw
  695.         IF sh THEN config_size_y:=sh
  696.         barh:=scr.barheight
  697.         UnlockPubScreen(0,scr);scr:=0
  698.         IF openproj(filename)
  699.             openscreen(retdepth(mode))
  700.             docheck(fixpow+100,TRUE)
  701.             SELECT fixpow
  702.             CASE 0;fixpower:=0
  703.             CASE 1;fixpower:=32
  704.             CASE 2;fixpower:=128
  705.             CASE 3;fixpower:=256
  706.             CASE 4;fixpower:=1024
  707.             CASE 5;fixpower:=2048
  708.             CASE 6;fixpower:=4096
  709.             CASE 7;fixpower:=8192
  710.             CASE 8;fixpower:=16384
  711.             CASE 9;fixpower:=32768
  712.             ENDSELECT
  713.             ->blankbmap:=AllocBitMap(maximumw,maximumh,1, BMF_CLEAR,NIL)
  714.             GetRGB32(cm,0,256,buffer)
  715.             current_set:=0
  716.             docheck(20+current_palet,FALSE)
  717.             current_palet:=pb[current_set]
  718.             docheck(20+current_palet,TRUE)
  719.             updatecolors()
  720.             updatelist()
  721.             newproj:=FALSE
  722.             WHILE ((quit=FALSE) AND (newproj=FALSE))
  723.                 IF ((hand<>0) AND (hand1<>0) AND (hand2<>0) AND (menuverify=FALSE))
  724.                     IF (retdepth(mode)<5)
  725.                         SetRGB32(vp,17,$FFFFFFFF,$DDDDDDDD,$88888888)
  726.                         SetRGB32(vp,18,$99999999,$66666666,$33333333)
  727.                         SetRGB32(vp,19,0,0,0)
  728.                     ENDIF
  729.                     IF (hand<>3)
  730.                         IF (dragmode=FALSE)
  731.                             SetWindowPointerA(win,[WA_POINTER,hand1,WA_POINTERDELAY,FALSE,NIL,NIL])
  732.                         ELSE
  733.                             SetWindowPointerA(win,[WA_POINTER,hand2,WA_POINTERDELAY,FALSE,NIL,NIL])
  734.                         ENDIF
  735.                     ELSE
  736.                         IF (dragmode<>FALSE)
  737.                             SetWindowPointerA(win,[WA_POINTER,hand3,WA_POINTERDELAY,FALSE,NIL,NIL])
  738.                         ELSE
  739.                             ClearPointer(win)
  740.                         ENDIF
  741.                     ENDIF                        
  742.                 ELSE
  743.                     ClearPointer(win)
  744.                 ENDIF
  745.                 Wait(-1)
  746.                 CtrlC()
  747.                 hitflag:=0
  748.                 WHILE (mes:=Gt_GetIMsg(win.userport))
  749.                     IF (mes.class=IDCMP_MENUVERIFY)
  750.                         IF dragmode
  751.                             mes.code:=MENUCANCEL
  752.                             IF (dragmode=TRUE)
  753.                                 IF backrast THEN ClipBlit(backrast,0,0,rp,oldx-offx,oldy-offy,iconwidth,iconheight,$C0)
  754.                                 placeobj(curobj,origx,origy);pauseflag:=TRUE
  755.                                 disposesaveback()
  756.                                 dragmode:=FALSE;curobj:=-1;noreportmousemoves(win)
  757.                                 SetWindowTitles(win,-1,' Play KiSS 0.88')
  758.                             ENDIF
  759.                         ELSE
  760.                             menucolors(buffer)
  761.                             ClearPointer(win);menuverify:=TRUE
  762.                         ENDIF
  763.                     ENDIF
  764.                     IF (mes.class=IDCMP_MENUPICK)
  765.                         ClearPointer(win);menuverify:=FALSE
  766.                         code:=mes.code
  767.                         WHILE (code<>MENUNULL)
  768.                             iadd:=ItemAddress(menu,code)
  769.                             IF iadd
  770.                                 hit:=Long(iadd+34)
  771.                                 check:=(Int(iadd+12) AND CHECKED)
  772. ->                                IF hit=75 THEN fixxed:=IF check THEN FALSE ELSE TRUE
  773.                                 IF ((hit>=100) AND (hit<=109))
  774.                                     SELECT hit
  775.                                     CASE 100;fixpower:=0;fixpow:=0
  776.                                     CASE 101;fixpower:=32;fixpow:=1
  777.                                     CASE 102;fixpower:=128;fixpow:=2
  778.                                     CASE 103;fixpower:=256;fixpow:=3
  779.                                     CASE 104;fixpower:=1024;fixpow:=4
  780.                                     CASE 105;fixpower:=2048;fixpow:=5
  781.                                     CASE 106;fixpower:=4096;fixpow:=6
  782.                                     CASE 107;fixpower:=8192;fixpow:=7
  783.                                     CASE 108;fixpower:=16384;fixpow:=8
  784.                                     CASE 109;fixpower:=32769;fixpow:=9
  785.                                     ENDSELECT
  786.                                 ENDIF
  787.                                 IF hit=76 THEN IF check THEN hand:=0
  788.                                 IF hit=78 THEN IF check THEN hand:=TRUE
  789.                                 IF hit=79 THEN IF check THEN hand:=3
  790.                                 IF hit=77
  791.                                     bound:=IF check THEN TRUE ELSE FALSE
  792.                                 ENDIF
  793.                                 IF hit=89 THEN waittof:=IF check THEN TRUE ELSE FALSE
  794.                                 IF ((hit>=80) AND (hit<=84))
  795.                                     rtdrag:=hit-80
  796.                                 ENDIF
  797.                                 IF hit=66 THEN quit:=TRUE
  798.                                 IF hit=4
  799.                                     updatecolors()
  800.                                     updatelist()
  801.                                 ENDIF
  802.                                 IF hit=3 THEN hitflag:=3
  803.                                 IF hit=2 THEN hitflag:=2
  804.                                 IF hit=1 THEN newproj:=TRUE
  805.                                 IF ((hit>=30) AND (hit<=39))
  806.                                     IF current_set<>(hit-30)
  807.                                         current_set:=hit-30
  808.                                         SetWindowPointerA(win,[$80000098,TRUE,WA_POINTERDELAY,TRUE,NIL,NIL])
  809.                                         FOR i:=0 TO MAX_CELL-1
  810.                                             cache_cell(i,CACHE_CHECK)
  811.                                         ENDFOR
  812.                                         docheck(20+current_palet,FALSE)
  813.                                         current_palet:=pb[current_set]
  814.                                         docheck(20+current_palet,TRUE)
  815.                                         updatecolors()
  816.                                         updatelist()
  817.                                     ENDIF
  818.                                 ENDIF
  819.                                 IF ((hit>=20) AND (hit<=29))
  820.                                     current_palet:=hit-20
  821.                                     updatecolors()
  822.                                 ENDIF
  823.                                 code:=iadd.nextselect
  824.                             ELSE
  825.                                 code:=MENUNULL
  826.                             ENDIF
  827.                         ENDWHILE
  828.                         updatecolors()
  829.                     ENDIF
  830.                     IF (mes.class=IDCMP_INTUITICKS) THEN drawx,drawy:=boundize(mes.mousex,mes.mousey)
  831.                     IF (mes.class=IDCMP_MOUSEMOVE) THEN drawx,drawy:=boundize(mes.mousex,mes.mousey)
  832.                     IF (mes.class=IDCMP_MOUSEBUTTONS)
  833.                         pauseflag:=FALSE
  834.                         IF mes.code=SELECTDOWN
  835.                             menuverify:=FALSE
  836.                             curobj,offx,offy:=findobj(mes.mousex,mes.mousey)
  837.                             origx:=mes.mousex-offx;origy:=mes.mousey-offy
  838.                             IF (curobj>-1)
  839.                                 dragmode:=TRUE;reportmousemoves(win)
  840.                                 removeobj(curobj)
  841.                                 createsaveback(curobj)
  842.                                 oldx:=-5000;oldy:=-5000
  843.                                 ii:=0
  844.                                 FOR i:=0 TO MAX_CELL-1
  845.                                     IF cell[i].mark=curobj THEN ii:=ii+1
  846.                                 ENDFOR
  847. StringF(string,'Object #\d has \d cells. @(\d[3],\d[3]) CHIP:\d',curobj,ii,mes.mousex-offx,mes.mousey-offy,AvailMem(MEMF_CHIP))
  848. SetWindowTitles(win,-1,string)
  849.                             ENDIF
  850.                         ENDIF
  851.                         IF mes.code=SELECTUP
  852.                             IF ((curobj>-1) AND (dragmode=TRUE))
  853.                                 IF backrast THEN ClipBlit(backrast,0,0,rp,oldx-offx,oldy-offy,iconwidth,iconheight,$C0)
  854.                                 placeobj(curobj,mes.mousex-offx,mes.mousey-offy);pauseflag:=TRUE
  855.                                 disposesaveback()
  856.                                 dragmode:=FALSE;curobj:=-1;noreportmousemoves(win)
  857.                                 SetWindowTitles(win,-1,' Play KiSS 0.88')
  858.                             ENDIF
  859.                         ENDIF
  860.                         IF mes.code=MENUDOWN
  861.                             IF (dragmode=TRUE)
  862.                                 IF backrast THEN ClipBlit(backrast,0,0,rp,oldx-offx,oldy-offy,iconwidth,iconheight,$C0)
  863.                                 placeobj(curobj,origx,origy);pauseflag:=TRUE
  864.                                 disposesaveback()
  865.                                 dragmode:=FALSE;curobj:=-1;noreportmousemoves(win)
  866.                                 SetWindowTitles(win,-1,' Play KiSS 0.88')
  867.                             ENDIF
  868.                         ENDIF
  869.                     ENDIF
  870.               Gt_ReplyIMsg(mes)
  871.                 ENDWHILE
  872.                 SELECT hitflag
  873.                 CASE 2
  874.                     WbenchToFront()
  875.                     splitname(filename,dir,file)
  876.                     ii:=AslRequest(filereq,[ASL_HAIL,'Select .CNF file',
  877.                             ASL_OKTEXT,'Save',ASL_FILE,file,ASL_DIR,dir,
  878.                             ASLFR_DOPATTERNS,TRUE,ASLFR_DOSAVEMODE,TRUE,FILF_NEWIDCMP,TRUE,NIL,NIL])
  879.                     WbenchToBack()
  880.                     IF ii
  881.                         StrCopy(string,filename,ALL)
  882.                         StrCopy(filename,filereq.drawer,ALL)
  883.                         AddPart(filename,filereq.file,490)
  884.                         oldfh:=Open(filename,MODE_OLDFILE)
  885.                         newfh:=1
  886.                         IF oldfh
  887.                             Close(oldfh)
  888.                             menucolors(buffer)
  889.                             newfh:=EasyRequestArgs(win,[20,0,'Confirm overwrite!',
  890.                                 'File exists.\nDo you wish to overwrite?',
  891.                                 'Overwrite|Cancel'],0,0)
  892.                             updatecolors()
  893.                         ENDIF
  894.                         IF newfh
  895.                             SetWindowPointerA(win,[$80000098,TRUE,WA_POINTERDELAY,TRUE,NIL,NIL])
  896.                             filelen:=FileLength(string)
  897.                             IF (filelen>0)
  898.                                 filebuf:=New(filelen)
  899.                                 oldfh:=Open(string,MODE_OLDFILE)
  900.                                 IF oldfh
  901.                                     Read(oldfh,filebuf,filelen)
  902.                                     Close(oldfh)
  903.                                     bufptr:=filebuf
  904.                                     WHILE ((((Char(bufptr)<>10) OR (Char(bufptr)<>13)) AND (Char(bufptr+1)<>"$")) AND (bufptr<=(filebuf+filelen)))
  905.                                         bufptr:=bufptr+1
  906.                                     ENDWHILE
  907.                                     newfh:=Open(filename,MODE_NEWFILE)
  908.                                     IF newfh
  909.                                         Write(newfh,filebuf,(bufptr-filebuf+1))
  910.                                         FOR i:=0 TO 9
  911.                                             StringF(string,'\n$\d[1]',pb[i]);Write(newfh,string,StrLen(string))
  912.                                             ii:=0
  913.                                             FOR t:=0 TO MAX_CELL-1
  914.                                                 IF (cell[t].setxy.set[i]<10)
  915.                                                     ii:=bigger(ii,cell[t].mark)
  916.                                                 ENDIF
  917.                                             ENDFOR
  918.                                             FOR t:=0 TO ii STEP 16
  919.                                                 FOR tt:=t TO smaller(t+15,ii)
  920.                                                     zz:=-11
  921.                                                     FOR zzz:=0 TO MAX_CELL-1
  922.                                                         IF (cell[zzz].setxy.set[i]<10)
  923.                                                             IF (cell[zzz].mark=tt)
  924.                                                                 zz:=zzz
  925.                                                             ENDIF
  926.                                                         ENDIF
  927.                                                     ENDFOR
  928.                                                     IF zz>=0
  929.                                                         StringF(string,' \d,\d',cell[zz].setxy.x[i],cell[zz].setxy.y[i])
  930.                                                         Write(newfh,string,StrLen(string))
  931.                                                     ELSE
  932.                                                         Write(newfh,' *',2)
  933.                                                     ENDIF
  934.                                                 ENDFOR
  935.                                                 Write(newfh,'\n',1)
  936.                                             ENDFOR
  937.                                             Write(newfh,'\n',1)
  938.                                         ENDFOR
  939.                                         Write(newfh,'\n;save file written by - Play KiSS v0.88 for Amiga computers\n\n\n',61)
  940.                                         Close(newfh)
  941.                                     ENDIF
  942.                                 ENDIF
  943.                                 Dispose(filebuf)
  944.                             ENDIF
  945.                             ClearPointer(win)
  946.                         ENDIF
  947.                     ENDIF
  948.                 CASE 3
  949.                     menucolors(buffer)
  950.                     EasyRequestArgs(win,[20,0,'About "Play KiSS"',
  951.                             'Play KiSS v0.92 - July 19, 1995\nwritten by Chad Randall\n(crandall@conch.aa.msen.com)\n---\nKISS/GS4 compatibility\n(All limits affected by CHIP or FAST memory)\n---\nReleased as PUBLIC DOMAIN\nNo warranty of any kind',
  952.                             'Ok'],0,0)
  953.                     updatecolors()
  954.                 ENDSELECT
  955.  
  956.                 IF ((dragmode=TRUE) AND (curobj>=0))
  957.                     IF ((oldx<>drawx) OR (oldy<>drawy))
  958.                         IF (oldx<>-5000) THEN IF (backrast<>0) THEN ClipBlit(backrast,0,0,rp,oldx-offx,oldy-offy,iconwidth,iconheight,$C0)
  959.                         IF (backrast<>0) THEN ClipBlit(rp,drawx-offx,drawy-offy,backrast,0,0,iconwidth,iconheight,$C0)
  960.                         IF (rtdrag>=DRAG_DIRTY)
  961.                             IF ((maskbmap<>0) AND (iconbmap<>0))
  962.                                 BltBitMap(iconbmap,0,0,maskbmap,0,0,iconwidth,iconheight,1,1,0)
  963.                                 FOR i:=MAX_CELL-1 TO 0 STEP -1
  964.                                     IF (cell[i].setxy.set[current_set]<10)
  965.                                         IF (cell[i].clip_pix<>0)
  966.                                             IF (cell[i].mark=curobj)
  967.                                                 BltBitMap(cell[i].clip_pix,0,0,maskbmap,cell[i].xoffset,cell[i].yoffset,cell[i].xsize,cell[i].ysize,$E0,%00000001,0)
  968.                                             ELSE
  969.                                                 IF (((cell[i].setxy.x[current_set]+cell[i].xoffset)<(drawx-offx+iconwidth)) AND ((cell[i].setxy.x[current_set]+cell[i].xsize+cell[i].xoffset)>(drawx-offx)))
  970.                                                     IF (((cell[i].setxy.y[current_set]+cell[i].yoffset)<(drawy-offy+iconheight)) AND ((cell[i].setxy.y[current_set]+cell[i].ysize+cell[i].yoffset)>(drawy-offy)))
  971.                                                         zox:=0;zoy:=0
  972.                                                         zx:=(drawx-offx)-(cell[i].setxy.x[current_set]+cell[i].xoffset)
  973.                                                         zy:=(drawy-offy)-(cell[i].setxy.y[current_set]+cell[i].yoffset)
  974.                                                         IF (zx<=0)
  975.                                                             zox:=0
  976.                                                             zx:=Abs(zx)
  977.                                                         ELSE
  978.                                                             zox:=zx
  979.                                                             zx:=0
  980.                                                         ENDIF
  981.                                                         IF (zy<=0)
  982.                                                             zoy:=0
  983.                                                             zy:=Abs(zy)
  984.                                                         ELSE
  985.                                                             zoy:=zy
  986.                                                             zy:=0
  987.                                                         ENDIF
  988.                                                         zw:=limit(cell[i].xsize-zox,0,iconwidth-zx)
  989.                                                         zh:=limit(cell[i].ysize-zoy,0,iconheight-zy)
  990. ->    WriteF('\nBltBitMap($\h,\d,\d,$\h,\d,\d->\d,\d)',cell[i].clip_pix,zox,zoy,maskbmap,zx,zy,zw,zh)
  991.                                                         BltBitMap(cell[i].clip_pix,zox,zoy,maskbmap,zx,zy,zw,zh,$20,%00000001,0)
  992.                                                     ENDIF
  993.                                                 ENDIF
  994.                                             ENDIF
  995.                                         ENDIF
  996.                                     ENDIF
  997.                                 ENDFOR
  998.                                 IF ((rtdrag=DRAG_DIRTY) OR ((rtdrag=DRAG_SMART) AND (copybmap=0)))
  999.                                     BltMaskBitMapRastPort(iconbmap,0,0,rp,drawx-offx,drawy-offy,iconwidth,iconheight,%11100000,Long(maskbmap+8))
  1000.                                 ELSE
  1001.                                     IF ((copyrast<>0) AND (copybmap<>0))
  1002.                                         BltBitMap(iconbmap,0,0,copybmap,0,0,iconwidth,iconheight,$C0,$FF,0)
  1003.                                         BltBitMap(maskbmap,0,0,copybmap,0,0,iconwidth,iconheight,$80,$FF,0)
  1004.                                         BltBitMapRastPort(maskbmap,0,0,rp,drawx-offx,drawy-offy,iconwidth,iconheight,$20)
  1005.                                         BltBitMapRastPort(copybmap,0,0,rp,drawx-offx,drawy-offy,iconwidth,iconheight,$E0)
  1006.                                     ENDIF
  1007.                                 ENDIF
  1008.                             ENDIF
  1009.                         ENDIF
  1010.                         IF ((rtdrag=DRAG_TOP) OR (rtdrag=DRAG_PAUSE))
  1011.                             IF (maskbmap<>0) THEN BltBitMapRastPort(maskbmap,0,0,rp,drawx-offx,drawy-offy,iconwidth,iconheight,$20)
  1012.                             IF (iconbmap<>0) THEN BltBitMapRastPort(iconbmap,0,0,rp,drawx-offx,drawy-offy,iconwidth,iconheight,$E0)
  1013.                         ENDIF
  1014.  
  1015.                         IF waittof
  1016.                             WaitBlit()
  1017.                             WaitTOF()
  1018.                             WaitTOF()
  1019. ->                            FOR i:=0 TO 2
  1020.                                 WaitBOVP(vp)
  1021. ->                            ENDFOR
  1022.                         ENDIF
  1023.                         oldx:=drawx;oldy:=drawy;pauseflag:=FALSE
  1024.                     ELSE
  1025.                         IF pauseflag=FALSE
  1026.                             IF (rtdrag=DRAG_PAUSE)
  1027.                                 drawobj(curobj,drawx-offx,drawy-offy)
  1028.                                 pauseflag:=TRUE
  1029.                             ENDIF
  1030.                         ENDIF
  1031.                     ENDIF
  1032.                 ENDIF
  1033.             ENDWHILE
  1034.             disposesaveback()
  1035.             flushproj()
  1036. ->            IF blankbmap THEN FreeBitMap(blankbmap);blankbmap:=0
  1037.             closescreen()
  1038.         ENDIF
  1039.     ENDWHILE    
  1040.  
  1041. EXCEPT DO
  1042.     FOR i:=0 TO MAX_CELL-1
  1043.         DisposeLink(cell[i].name)
  1044.     ENDFOR
  1045.     IF hand1 THEN DisposeObject(hand1)
  1046.     IF hand2 THEN DisposeObject(hand2)
  1047.     flushproj()
  1048.     END cell[MAX_CELL]
  1049.     END palet[16]
  1050.     END rectangle
  1051. ->    IF blankbmap THEN FreeBitMap(blankbmap);blankbmap:=0
  1052.     closescreen()
  1053.     Dispose(buffer)
  1054.     Dispose(region1)
  1055.     IF ((exception="^C") AND (outputmode=0)) THEN WriteF('***BREAK\n')
  1056.     IF ((exception="Kick"))
  1057.         WriteF('You need at least OS 3.0 (Kickstart 39) to "Play KiSS"!!!\n')
  1058.         DisplayBeep(0)
  1059.     ENDIF
  1060.     IF filereq THEN FreeAslRequest(filereq)
  1061.     IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
  1062.     IF layersbase THEN CloseLibrary(layersbase)
  1063.     IF aslbase THEN CloseLibrary(aslbase)
  1064.     IF iconbase THEN CloseLibrary(iconbase)
  1065. ENDPROC
  1066.  
  1067. PROC unpackmenunumber(code)
  1068.     DEF menu,item,sub,c
  1069.     c:=code
  1070.     menu:=c AND %11111
  1071.     c:=Shr(c,5)
  1072.     item:=c AND %111111
  1073.     c:=Shr(c,6)
  1074.     sub:=c AND %11111
  1075. ENDPROC menu,item,sub
  1076.  
  1077. PROC packmenunumber(menu=MENUNULL,item=NOITEM,sub=NOSUB)
  1078.     DEF work
  1079.     IF menu=-1 THEN menu:=MENUNULL
  1080.     IF item=-1 THEN item:=NOITEM
  1081.     IF sub=-1 THEN sub:=NOSUB
  1082.     menu:=menu AND %11111
  1083.   item:=item AND %111111
  1084.   sub:=sub AND %11111
  1085.     work:=Shl(sub,8)
  1086.     work:=Shl(work,3)
  1087.     work:=(work OR (Shl(item,5)))
  1088.     work:=(work OR menu)
  1089. ENDPROC work
  1090.  
  1091. PROC findmenuitem(menu:PTR TO menu,title,item=NOITEM,subitem=NOSUB)
  1092.     DEF menuitem:PTR TO menuitem
  1093.     DEF localscratch
  1094.     IF title>0
  1095.         FOR localscratch:=1 TO title
  1096.             menu:=menu.nextmenu
  1097.         ENDFOR
  1098.     ENDIF
  1099.     menuitem:=menu
  1100.     IF item<>NOITEM
  1101.         menuitem:=menu.firstitem
  1102.         FOR localscratch:=1 TO item
  1103.             menuitem:=menuitem.nextitem
  1104.         ENDFOR
  1105.         IF (subitem<>NOSUB)
  1106.             menuitem:=menuitem.subitem
  1107.             IF subitem>0
  1108.                 FOR localscratch:=1 TO subitem
  1109.                     menuitem:=menuitem.nextitem
  1110.                 ENDFOR
  1111.             ENDIF
  1112.         ENDIF
  1113.     ENDIF
  1114. ENDPROC menuitem
  1115.  
  1116. PROC docheck(item,f=0)
  1117.     DEF mi:PTR TO menuitem,t,i,si
  1118.     t,i,si:=findmenuid(menu,item)  ->  Finds t,s,si using our USERID!
  1119.     mi:=findmenuitem(menu,t,i,si)  ->  Finds a menuitem struct using t,s,si!  Redundant...
  1120.     IF mi>50
  1121.         IF f=0
  1122.             IF (mi.flags AND CHECKED) THEN mi.flags:=(mi.flags-CHECKED)
  1123.         ELSE
  1124.             mi.flags:=(mi.flags OR CHECKED)
  1125.         ENDIF    
  1126.     ENDIF
  1127. ENDPROC
  1128.  
  1129. PROC findmenuid(menu:PTR TO menu,id)
  1130.     DEF menuitem:PTR TO menuitem,subitem:PTR TO menuitem
  1131.     DEF t=-1,i=-1,si=-1
  1132.     WHILE menu>0
  1133.         t:=t+1
  1134.         menuitem:=menu.firstitem
  1135.         WHILE menuitem>0
  1136.             i:=i+1
  1137.             subitem:=menuitem.subitem
  1138.             IF (Long(menuitem+34)=id) THEN RETURN t,i,-1
  1139.             WHILE subitem>0
  1140.                 si:=si+1
  1141.                 IF (Long(subitem+34)=id) THEN RETURN t,i,si
  1142.                 subitem:=subitem.nextitem            
  1143.             ENDWHILE
  1144.             menuitem:=menuitem.nextitem
  1145.             si:=-1
  1146.         ENDWHILE
  1147.         i:=-1
  1148.         menu:=menu.nextmenu
  1149.     ENDWHILE
  1150. ENDPROC -1,-1,-1
  1151.  
  1152. PROC boundize(dx,dy)
  1153.     IF bound
  1154.         dx:=limit(dx,offx,config_size_x-iconwidth+offx)
  1155.         dy:=limit(dy,offy,config_size_y-iconheight+offy-scr.barheight-1)
  1156.     ENDIF
  1157. ENDPROC dx,dy
  1158.  
  1159. PROC hex2int(str)
  1160.     DEF r=0
  1161.     WHILE (Char(str)<>0)
  1162.         IF ((Char(str)>="0") AND (Char(str)<="9"))
  1163.             r:=Shl(r,4)
  1164.             r:=r+(Char(str)-"0")
  1165.         ENDIF
  1166.         IF ((Char(str)>="A") AND (Char(str)<="F"))
  1167.             r:=Shl(r,4)
  1168.             r:=r+((Char(str)-"A")+10)
  1169.         ENDIF
  1170.         str:=str+1
  1171.     ENDWHILE
  1172. ENDPROC r
  1173.  
  1174. PROC menucolors(buffer)
  1175.     DEF i
  1176.     FOR i:=0 TO 3
  1177.         SetRGB32(vp,i,Long(buffer+(i*12)),Long(buffer+(i*12)+4),Long(buffer+(i*12)+8))
  1178.     ENDFOR
  1179.     FOR i:=17 TO 19
  1180.         SetRGB32(vp,i,Long(buffer+(i*12)),Long(buffer+(i*12)+4),Long(buffer+(i*12)+8))
  1181.     ENDFOR
  1182.     FOR i:=(Shl(1,retdepth(mode))-4) TO (Shl(1,retdepth(mode))-1)
  1183.         SetRGB32(vp,i,Long(buffer+(i*12)),Long(buffer+(i*12)+4),Long(buffer+(i*12)+8))
  1184.     ENDFOR
  1185. ENDPROC
  1186.  
  1187. PROC placeobj(obj,x,y,flag=FALSE)
  1188.     DEF i,w=0,h=0
  1189.     IF flag THEN removeobj(obj)
  1190.     IF bound
  1191.         FOR i:=0 TO MAX_CELL-1
  1192.             IF (cell[i].mark=obj)
  1193.                 w:=bigger(w,cell[i].xoffset+cell[i].xsize)
  1194.                 h:=bigger(h,cell[i].yoffset+cell[i].ysize)
  1195.             ENDIF
  1196.         ENDFOR
  1197.         x:=limit(x,0,config_size_x-w)
  1198.         y:=limit(y,0,config_size_y-h-scr.barheight-1)
  1199.     ENDIF
  1200.     FOR i:=0 TO MAX_CELL-1
  1201.         IF (cell[i].mark=obj)
  1202.             cell[i].setxy.x[current_set]:=x
  1203.             cell[i].setxy.y[current_set]:=y
  1204.         ENDIF
  1205.     ENDFOR
  1206.     drawobj(obj)
  1207. ENDPROC
  1208.  
  1209. PROC findobj(x,y)
  1210.     DEF i
  1211.     FOR i:=0 TO MAX_CELL-1
  1212.         IF ((cell[i].fix<=fixpower) OR (fixxed=TRUE))
  1213.         IF (cell[i].setxy.set[current_set]<10)
  1214.         IF (x>=(cell[i].xoffset+cell[i].setxy.x[current_set]))
  1215.             IF (y>=(cell[i].yoffset+cell[i].setxy.y[current_set]))
  1216.                 IF (x<(cell[i].xoffset+cell[i].setxy.x[current_set]+cell[i].xsize))
  1217.                     IF (y<(cell[i].yoffset+cell[i].setxy.y[current_set]+cell[i].ysize))
  1218.                         IF ReadPixel(cell[i].pix_rp,(x-(cell[i].xoffset+cell[i].setxy.x[current_set])),y-(cell[i].yoffset+cell[i].setxy.y[current_set]))>0
  1219.                             RETURN cell[i].mark,(x-cell[i].setxy.x[current_set]),(y-cell[i].setxy.y[current_set])
  1220.                         ENDIF
  1221.                     ENDIF
  1222.                 ENDIF
  1223.             ENDIF
  1224.         ENDIF
  1225.         ENDIF
  1226.         ENDIF
  1227.     ENDFOR
  1228. ENDPROC -1,-1,-1
  1229.  
  1230.  
  1231. PROC updatecolors()
  1232.     DEF i,pn=0,t
  1233.     FOR i:=0 TO 15
  1234.         IF (palet[i].color[current_palet]<>0)
  1235.             FOR t:=0 TO (palet[i].color_num-1)
  1236.                 SetRGB32(vp,pn,(Long(palet[i].color[current_palet]+(t*SIZEOF color))),(Long(palet[i].color[current_palet]+(t*SIZEOF color)+4)),(Long(palet[i].color[current_palet]+(t*SIZEOF color)+8)))
  1237. ->                SetRGB32(vp,pn,Shl(Shl(pn*$1111,8),8),pn*$1111,Shl(pn*$1111,8))
  1238. ->WriteF('\n\d \d \d \h,\h,\h',i,t,pn,Long(palet[i].color[current_palet]+(t*SIZEOF color)),Long(palet[i].color[current_palet]+(t*SIZEOF color)+4),Long(palet[i].color[current_palet]+(t*SIZEOF color)+8))
  1239.                 pn:=pn+1;IF pn>255 THEN pn:=255
  1240.             ENDFOR
  1241. ->            pn:=(pn+15)/16*16
  1242.         ENDIF
  1243.     ENDFOR
  1244. ENDPROC
  1245.  
  1246. /*PROC oldmaskobj(obj,x,y)
  1247.     DEF sp[8]:LIST,i,t,sd
  1248.  
  1249.     FOR i:=0 TO 7
  1250.         sp[i]:=Long(cell[obj].pix+8+(i*8))
  1251.     ENDFOR
  1252.     sd:=cell[obj].pix.depth
  1253.  
  1254.     cell[obj].pix.depth:=depth
  1255.     IF cell[obj].bit_per_pixel=4
  1256.         FOR i:=0 TO 3
  1257.             IF (cell[obj].palet_num AND Shl(1,i))
  1258.                 PutLong(cell[obj].pix+8+((i+4)*4),Long(cell[obj].clip_pix+8))
  1259.             ELSE
  1260.                 PutLong(cell[obj].pix+8+((i+4)*4),Long(blankbmap+8))
  1261.             ENDIF
  1262.         ENDFOR
  1263.     ENDIF
  1264.  
  1265.     BltMaskBitMapRastPort(cell[obj].pix,0,0,rp,x+cell[obj].xoffset,y+cell[obj].yoffset,(cell[obj].pix.bytesperrow)*8,cell[obj].ysize,
  1266.         %11100000,Long(cell[obj].clip_pix+8))
  1267.  
  1268.     cell[obj].pix.depth:=sd
  1269.     FOR i:=0 TO 7
  1270.         PutLong(cell[obj].pix+8+(i*8),sp[i])
  1271.     ENDFOR
  1272. ENDPROC
  1273. */
  1274. PROC maskobj(obj,x,y)
  1275.     DEF dummy
  1276.  
  1277.     IF cell[obj].pix=0 THEN RETURN
  1278.  
  1279.     IF (cell[obj].clip_pix_rp<>0) THEN ClipBlit(cell[obj].clip_pix_rp,0,0,rp,x+cell[obj].xoffset,y+cell[obj].yoffset,cell[obj].xsize,cell[obj].ysize,$20)
  1280.     IF (cell[obj].pix_rp<>0) THEN ClipBlit(cell[obj].pix_rp,0,0,rp,x+cell[obj].xoffset,y+cell[obj].yoffset,cell[obj].xsize,cell[obj].ysize,$E0)
  1281.     dummy:=cell[obj].palet_num
  1282.     SELECT dummy
  1283.         CASE 0 ;rp.mask:=%00000000
  1284.         CASE 1 ;rp.mask:=%00010000
  1285.         CASE 2 ;rp.mask:=%00100000
  1286.         CASE 3 ;rp.mask:=%00110000
  1287.         CASE 4 ;rp.mask:=%01000000
  1288.         CASE 5 ;rp.mask:=%01010000
  1289.         CASE 6 ;rp.mask:=%01100000
  1290.         CASE 7 ;rp.mask:=%01110000
  1291.         CASE 8 ;rp.mask:=%10000000
  1292.         CASE 9 ;rp.mask:=%10010000
  1293.         CASE 10;rp.mask:=%10100000
  1294.         CASE 11;rp.mask:=%10110000
  1295.         CASE 12;rp.mask:=%11000000
  1296.         CASE 13;rp.mask:=%11010000
  1297.         CASE 14;rp.mask:=%11100000
  1298.         CASE 15;rp.mask:=%11110000
  1299.     ENDSELECT
  1300.     IF (cell[obj].bit_per_pixel<8)
  1301.         dummy:=retdepth(mode)
  1302.         SELECT dummy
  1303.             CASE 4;rp.mask:=(rp.mask AND %00000000)
  1304.             CASE 5;rp.mask:=(rp.mask AND %00010000)
  1305.             CASE 6;rp.mask:=(rp.mask AND %00110000)
  1306.             CASE 7;rp.mask:=(rp.mask AND %01110000)
  1307.             CASE 8;rp.mask:=(rp.mask AND %11110000)
  1308.         ENDSELECT
  1309.         IF (cell[obj].clip_pix_rp<>0) THEN ClipBlit(cell[obj].clip_pix_rp,0,0,rp,x+cell[obj].xoffset,y+cell[obj].yoffset,cell[obj].xsize,cell[obj].ysize,$E0)
  1310.     ENDIF
  1311.     rp.mask:=%11111111
  1312. ENDPROC
  1313.  
  1314. PROC updatelist()
  1315.     DEF i,t
  1316.     SetRast(rp,0)
  1317.  
  1318.     SetWindowPointerA(win,[$80000098,TRUE,WA_POINTERDELAY,TRUE,NIL,NIL])
  1319.     FOR i:=MAX_CELL-1 TO 0 STEP -1
  1320.         IF (cell[i].mark>=0)
  1321.             IF (cell[i].setxy.set[current_set]<10)
  1322.                 maskobj(i,cell[i].setxy.x[current_set],cell[i].setxy.y[current_set])
  1323.             ENDIF
  1324.         ENDIF            
  1325.     ENDFOR
  1326.     ClearPointer(win)
  1327. ENDPROC
  1328.  
  1329. PROC removeobj(obj)
  1330.     DEF i,t
  1331.     DEF minx=10000,miny=10000
  1332.     DEF region,oldregion=0,rectangle:PTR TO rectangle
  1333.  
  1334.     region:=NewRegion()
  1335.     NEW rectangle
  1336.     rectangle.minx:=10000
  1337.     rectangle.miny:=10000
  1338.  
  1339.     FOR i:=0 TO MAX_CELL-1
  1340.         IF cell[i].mark=obj
  1341.             rectangle.minx:=smaller(rectangle.minx,cell[i].setxy.x[current_set]+cell[i].xoffset)
  1342.             rectangle.miny:=smaller(rectangle.miny,cell[i].setxy.y[current_set]+cell[i].yoffset)
  1343.             rectangle.maxx:=bigger(rectangle.maxx,cell[i].setxy.x[current_set]+cell[i].xoffset+cell[i].xsize)
  1344.             rectangle.maxy:=bigger(rectangle.maxy,cell[i].setxy.y[current_set]+cell[i].yoffset+cell[i].ysize)
  1345.         ENDIF
  1346.     ENDFOR
  1347.     OrRectRegion(region,rectangle)
  1348.  
  1349.  
  1350.     oldregion:=InstallClipRegion(win.wlayer,region)
  1351.  
  1352.     SetRast(rp,0)
  1353.     FOR i:=MAX_CELL-1 TO 0 STEP -1
  1354.         IF ((cell[i].mark>=0) AND (cell[i].mark<>obj))
  1355.             IF (cell[i].setxy.set[current_set]<10)
  1356.  
  1357.                 maskobj(i,cell[i].setxy.x[current_set],cell[i].setxy.y[current_set])
  1358.  
  1359. /*                IF (cell[i].clip_pix_rp<>0) THEN ClipBlit(cell[i].clip_pix_rp,0,0,rp,cell[i].setxy.x[current_set]+cell[i].xoffset,cell[i].setxy.y[current_set]+cell[i].yoffset,cell[i].xsize,cell[i].ysize,$20)
  1360.                 IF (cell[i].pix_rp<>0) THEN ClipBlit(cell[i].pix_rp,0,0,rp,cell[i].setxy.x[current_set]+cell[i].xoffset,cell[i].setxy.y[current_set]+cell[i].yoffset,cell[i].xsize,cell[i].ysize,$E0)
  1361.                 dummy:=cell[i].palet_num
  1362.                 SELECT dummy
  1363.                     CASE 0 ;rp.mask:=%00000000
  1364.                     CASE 1 ;rp.mask:=%00010000
  1365.                     CASE 2 ;rp.mask:=%00100000
  1366.                     CASE 3 ;rp.mask:=%00110000
  1367.                     CASE 4 ;rp.mask:=%01000000
  1368.                     CASE 5 ;rp.mask:=%01010000
  1369.                     CASE 6 ;rp.mask:=%01100000
  1370.                     CASE 7 ;rp.mask:=%01110000
  1371.                     CASE 8 ;rp.mask:=%10000000
  1372.                     CASE 9 ;rp.mask:=%10010000
  1373.                     CASE 10;rp.mask:=%10100000
  1374.                     CASE 11;rp.mask:=%10110000
  1375.                     CASE 12;rp.mask:=%11000000
  1376.                     CASE 13;rp.mask:=%11010000
  1377.                     CASE 14;rp.mask:=%11100000
  1378.                     CASE 15;rp.mask:=%11110000
  1379.                 ENDSELECT
  1380.                 dummy:=retdepth(mode)
  1381.                 SELECT dummy
  1382.                     CASE 4;rp.mask:=(rp.mask AND %00000000)
  1383.                     CASE 5;rp.mask:=(rp.mask AND %00010000)
  1384.                     CASE 6;rp.mask:=(rp.mask AND %00110000)
  1385.                     CASE 7;rp.mask:=(rp.mask AND %01110000)
  1386.                     CASE 8;rp.mask:=(rp.mask AND %11110000)
  1387.                 ENDSELECT
  1388.                 IF (cell[i].clip_pix_rp<>0) THEN ClipBlit(cell[i].clip_pix_rp,0,0,rp,cell[i].setxy.x[current_set]+cell[i].xoffset,cell[i].setxy.y[current_set]+cell[i].yoffset,cell[i].xsize,cell[i].ysize,$E0)
  1389.                 rp.mask:=%11111111*/
  1390.             ENDIF
  1391.         ENDIF            
  1392.     ENDFOR
  1393.     InstallClipRegion(win.wlayer,oldregion)
  1394.     END rectangle
  1395.     IF region
  1396.         DisposeRegion(region)
  1397.     ENDIF
  1398. ENDPROC
  1399.  
  1400. PROC drawobj(obj,xxxx=-500,yyyy=-500)
  1401.     DEF i,t
  1402.     DEF minx=10000,miny=10000
  1403.     DEF region,oldregion=0,rectangle:PTR TO rectangle
  1404.     DEF xx,yy
  1405.  
  1406.     region:=NewRegion()
  1407.     NEW rectangle
  1408.  
  1409.     rectangle.minx:=10000
  1410.     rectangle.miny:=10000
  1411.  
  1412.     FOR i:=0 TO MAX_CELL-1
  1413.         IF cell[i].mark=obj
  1414.             xx:=IF (xxxx=-500) THEN cell[i].setxy.x[current_set] ELSE xxxx
  1415.             yy:=IF (yyyy=-500) THEN cell[i].setxy.y[current_set] ELSE yyyy
  1416.             rectangle.minx:=smaller(rectangle.minx,xx+cell[i].xoffset)
  1417.             rectangle.miny:=smaller(rectangle.miny,yy+cell[i].yoffset)
  1418.             rectangle.maxx:=bigger(rectangle.maxx,xx+cell[i].xoffset+cell[i].xsize)
  1419.             rectangle.maxy:=bigger(rectangle.maxy,yy+cell[i].yoffset+cell[i].ysize)
  1420.         ENDIF
  1421.     ENDFOR
  1422.     OrRectRegion(region,rectangle)
  1423.  
  1424.     oldregion:=InstallClipRegion(win.wlayer,region)
  1425.  
  1426.     FOR i:=MAX_CELL-1 TO 0 STEP -1
  1427.         IF ((cell[i].mark>=0))
  1428.             IF (cell[i].setxy.set[current_set]<10)
  1429.                 
  1430. xx:=cell[i].setxy.x[current_set]
  1431. yy:=cell[i].setxy.y[current_set]
  1432.  
  1433.                 IF (cell[i].mark=obj)
  1434.                     IF (xxxx>-500)
  1435.                         IF (yyyy>-500)
  1436.                             xx:=xxxx
  1437.                             yy:=yyyy
  1438.                         ENDIF
  1439.                     ENDIF
  1440.                 ENDIF
  1441.  
  1442.                 maskobj(i,xx,yy)
  1443.  
  1444. /*
  1445. ->                xx:=IF ((x<>-50000) AND (cell[i].mark=obj)) THEN y ELSE cell[i].setxy.x[current_set]
  1446. ->                yy:=IF ((y<>-50000) AND (cell[i].mark=obj)) THEN x ELSE cell[i].setxy.y[current_set]
  1447.                 IF (cell[i].clip_pix_rp<>0) THEN ClipBlit(cell[i].clip_pix_rp,0,0,rp,xx+cell[i].xoffset,yy+cell[i].yoffset,cell[i].xsize,cell[i].ysize,$20)
  1448.                 IF (cell[i].pix_rp<>0) THEN ClipBlit(cell[i].pix_rp,0,0,rp,xx+cell[i].xoffset,yy+cell[i].yoffset,cell[i].xsize,cell[i].ysize,$E0)
  1449.                 dummy:=cell[i].palet_num
  1450.                 SELECT dummy
  1451.                     CASE 0 ;rp.mask:=%00000000
  1452.                     CASE 1 ;rp.mask:=%00010000
  1453.                     CASE 2 ;rp.mask:=%00100000
  1454.                     CASE 3 ;rp.mask:=%00110000
  1455.                     CASE 4 ;rp.mask:=%01000000
  1456.                     CASE 5 ;rp.mask:=%01010000
  1457.                     CASE 6 ;rp.mask:=%01100000
  1458.                     CASE 7 ;rp.mask:=%01110000
  1459.                     CASE 8 ;rp.mask:=%10000000
  1460.                     CASE 9 ;rp.mask:=%10010000
  1461.                     CASE 10;rp.mask:=%10100000
  1462.                     CASE 11;rp.mask:=%10110000
  1463.                     CASE 12;rp.mask:=%11000000
  1464.                     CASE 13;rp.mask:=%11010000
  1465.                     CASE 14;rp.mask:=%11100000
  1466.                     CASE 15;rp.mask:=%11110000
  1467.                 ENDSELECT
  1468.                 dummy:=retdepth(mode)
  1469.                 SELECT dummy
  1470.                     CASE 4;rp.mask:=(rp.mask AND %00000000)
  1471.                     CASE 5;rp.mask:=(rp.mask AND %00010000)
  1472.                     CASE 6;rp.mask:=(rp.mask AND %00110000)
  1473.                     CASE 7;rp.mask:=(rp.mask AND %01110000)
  1474.                     CASE 8;rp.mask:=(rp.mask AND %11110000)
  1475.                 ENDSELECT
  1476.                 IF (cell[i].clip_pix_rp<>0) THEN ClipBlit(cell[i].clip_pix_rp,0,0,rp,xx+cell[i].xoffset,yy+cell[i].yoffset,cell[i].xsize,cell[i].ysize,$E0)
  1477.                 rp.mask:=%11111111
  1478. */
  1479.             ENDIF
  1480.         ENDIF            
  1481.     ENDFOR
  1482.     InstallClipRegion(win.wlayer,oldregion)
  1483.     END rectangle
  1484.     IF region
  1485.         DisposeRegion(region)
  1486.     ENDIF
  1487. ENDPROC
  1488.  
  1489. /*PROC scanstring(fh,flag=FALSE)
  1490.     DEF l=-1,res=1
  1491.     DEF buf,str
  1492.     buf:=[0,0]:LONG
  1493.     str:=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]:LONG
  1494.     PutLong(buf,0)
  1495.     WHILE ((res>0) AND ((Char(buf)<>32) AND (Char(buf)<>10) AND (Char(buf)<>13) AND (Char(buf)<>9) AND (Char(buf)<>":") AND (Char(buf)<>"*") AND (Char(buf)<>",")))
  1496.         res:=Read(fh,buf,1)
  1497.         l:=l+1
  1498.         IF l<120
  1499.             PutChar(str+l,Char(buf))
  1500.         ENDIF
  1501.     ENDWHILE
  1502.     PutChar(str+l+1,0)
  1503.     IF flag THEN PutChar(str+l,0)
  1504. ENDPROC str,l*/
  1505.  
  1506. PROC openproj(str) HANDLE
  1507.     DEF fh=0
  1508.     DEF fib:PTR TO fileinfoblock
  1509.     DEF i,buf,f
  1510.     DEF newbuf=0
  1511.     DEF num=0,set=-1
  1512.     DEF set_str[MAX_SET]:LIST
  1513.     DEF palset
  1514.     DEF wbscr
  1515.  
  1516.     NEW fib;newbuf:=New(2000);buf:=[0,0,0]
  1517.     FOR i:=0 TO MAX_SET-1
  1518.         set_str[i]:=String(4096)
  1519.     ENDFOR
  1520.  
  1521.     StrCopy(filename,str,ALL)
  1522.     
  1523.     IF (fh:=Open(filename,MODE_OLDFILE))
  1524.  
  1525.         current_set:=0
  1526.         WbenchToFront()
  1527.         wbscr:=LockPubScreen('Workbench')
  1528.         outwin:=OpenWindowTagList(0,[WA_INNERWIDTH,480,WA_INNERHEIGHT,1,
  1529.             WA_TOP,32,WA_LEFT,80,
  1530.             WA_AUTOADJUST,TRUE,
  1531.             WA_TITLE,' Play KiSS 0.88 - Broken Spork Technologies',
  1532.             WA_FLAGS,WFLG_DEPTHGADGET OR WFLG_DRAGBAR OR WFLG_NOCAREREFRESH,
  1533.             WA_CUSTOMSCREEN,wbscr,
  1534.             NIL,NIL])
  1535.         IF wbscr THEN UnlockPubScreen(0,wbscr)
  1536.  
  1537.         palset:=0
  1538.         ->Delay(30)
  1539.         WHILE (Fgets(fh,newbuf,1024))
  1540.             i:=Char(newbuf)
  1541.             SELECT i
  1542.             CASE "%";load_palet(newbuf+1,palset);
  1543.                 palset:=palset+1;mode:=limit(mode+1,1,16)
  1544. ->            CASE "["
  1545.             CASE "("
  1546.                 load_config_size(newbuf+1)
  1547.             CASE "#"
  1548.                 load_config_cell(num,newbuf+1);num:=num+1
  1549.             CASE "$"
  1550.                 set:=set+1
  1551.                 StrCopy(set_str[set],newbuf+1,ALL)
  1552.             CASE " "
  1553.                 IF set>=0 THEN StrAdd(set_str[set],newbuf+1,ALL)
  1554.             ENDSELECT
  1555.         ENDWHILE
  1556.         FOR i:=0 TO set STEP 1
  1557.             load_config_set(i,set_str[i])
  1558.         ENDFOR
  1559.     ELSE
  1560.         Raise("DOS")
  1561.     ENDIF
  1562. EXCEPT DO
  1563.     IF outwin THEN CloseWindow(outwin);outwin:=0
  1564.     IF fh THEN Close(fh);fh:=0
  1565.     IF newbuf THEN Dispose(newbuf)
  1566.     END fib
  1567.     FOR i:=0 TO MAX_SET-1
  1568.         DisposeLink(set_str[i])
  1569.     ENDFOR
  1570.     IF exception="^C" THEN ReThrow()
  1571.     IF exception THEN RETURN FALSE
  1572. ENDPROC TRUE
  1573.  
  1574. PROC isdigit(s);IF (((s>="0") AND (s<="9")) OR (s=".") OR (s="-")) THEN RETURN TRUE;ENDPROC FALSE
  1575. PROC isalpha(s);IF (((s>="a") AND (s<="z")) OR ((s>="A") AND (s<="Z"))) THEN RETURN TRUE;ENDPROC FALSE
  1576. PROC ispunc(s);IF ((s=".") OR (s="-") OR (s="_")) THEN RETURN TRUE;ENDPROC FALSE
  1577.  
  1578. PROC scanforvalue(str)
  1579.     DEF l=0,i,s[100]:STRING,ins,iii=0
  1580.     WHILE (isdigit(Char(str+l)));l:=l+1;ENDWHILE
  1581.     StrCopy(s,str,l)
  1582.     ins:=InStr(str,'.')
  1583.     IF ((ins>0) AND (ins<=l))
  1584.         StrToLong(s,{i})
  1585.         StrToLong(s+ins+1,{iii})
  1586.     ELSE
  1587.         StrToLong(s,{i})
  1588.     ENDIF
  1589. ENDPROC i,l,iii
  1590.  
  1591. PROC scanforstring(str)
  1592.     DEF l=0
  1593.     WHILE (isdigit(Char(str+l)) OR isalpha(Char(str+l)) OR ispunc(Char(str+l)));l:=l+1;ENDWHILE
  1594. ENDPROC l
  1595.  
  1596. PROC load_config_cell(num,str)
  1597.     DEF p,c,i,j,n,secval
  1598.     DEF buf,mark,len
  1599.     buf:=[0,0,0,0,0,0,0,0,0,0,0,0,0]
  1600.     p:=str
  1601.     check_str(p)
  1602.     mark,len,secval:=scanforvalue(p)
  1603.     cell[num].mark:=mark
  1604.     cell[num].fix:=secval
  1605.     p:=p+len+1
  1606.  
  1607.     WHILE ((Char(p)=" ") OR (Char(p)=9));p:=p+1;ENDWHILE
  1608.     len:=scanforstring(p)
  1609.     StrCopy(cell[num].name,p,len)
  1610.     p:=p+len
  1611.  
  1612.     load_data_cell(cell[num].name,num)
  1613.     IF outwin
  1614.         StringF(string,'MEM:\d[9] OBJ #:\d[3] CEL #\d[3] (\d[3]x\d[3]) "\s" ',AvailMem(MEMF_CHIP),cell[num].mark,num,cell[num].xsize,cell[num].ysize,cell[num].name)
  1615.         SetWindowTitles(outwin,string,-1)
  1616.     ENDIF
  1617.     WHILE (Char(p)<>0)
  1618.         IF Char(p)="*"
  1619.             mark,len:=scanforvalue(p+1)
  1620.             cell[num].palet_num:=mark
  1621.             p:=p+1+len
  1622.         ENDIF
  1623.         IF Char(p)=":"
  1624.             p:=p+1
  1625.             FOR i:=0 TO MAX_SET-1;cell[num].setxy.set[i]:=50;ENDFOR
  1626.             WHILE (TRUE=TRUE)
  1627.                 mark:=(Char(p)-"0")
  1628.                 IF ((0<=mark) AND (mark<MAX_SET))
  1629.                     cell[num].setxy.set[mark]:=1
  1630.                 ENDIF
  1631.                 p:=p+1
  1632.                 EXIT (Char(p)=0)
  1633.             ENDWHILE
  1634.             cache_cell(num,CACHE_CHECK)
  1635.             RETURN
  1636.         ENDIF
  1637.     p:=p+1;ENDWHILE
  1638.     FOR i:=0 TO MAX_SET-1
  1639.         cell[num].setxy.set[i]:=1
  1640.     ENDFOR
  1641. ENDPROC
  1642.  
  1643. PROC load_palet(fn,num)
  1644.     DEF fh
  1645.     DEF buf:PTR TO CHAR
  1646.     DEF p,c,r,g,b,len,loop
  1647.     DEF dir[500]:STRING,oldfile[100]:STRING
  1648.     DEF byte_l,byte_h
  1649.  
  1650.     buf:=[0,0,0,0,0,0,0,0,0,0]
  1651.     check_str(fn)
  1652.     len:=scanforstring(fn)
  1653.     PutChar(fn+len,0)
  1654.     IF outwin
  1655.         StringF(string,'PALETTE #\d:\s ',num,fn)
  1656.         SetWindowTitles(outwin,string,-1)
  1657.     ENDIF
  1658.     splitname(filename,dir,oldfile)
  1659.     AddPart(dir,fn,490)
  1660.     fh:=Open(dir,MODE_OLDFILE)
  1661.     IF fh
  1662.         StrCopy(palet[num],dir,ALL)
  1663.         IF (check_kiss_header(fh)=1)
  1664.             Read(fh,buf,32)
  1665.             IF buf[4]=FILE_MARK_PALET
  1666.                 palet[num].color_num:=buf[9]*256+buf[8]
  1667.                 IF (palet[num].color_num>16);mode:=16;ENDIF
  1668.                 palet[num].palet_num:=buf[11]*256+buf[10]
  1669.                 palet[num].bit_per_pixel:=buf[5]
  1670.             ENDIF
  1671.         ELSE
  1672.             palet[num].color_num:=GS1_MAX_COLOR
  1673.             palet[num].palet_num:=MAX_PAL
  1674.             palet[num].bit_per_pixel:=12
  1675.         ENDIF
  1676.         p:=0;WHILE (p<palet[num].palet_num)
  1677.             palet[num].color[p]:=New(SIZEOF color*palet[num].color_num+50)
  1678.             c:=0;WHILE (c<palet[num].color_num)
  1679.                 IF palet[num].bit_per_pixel=12
  1680.                     Read(fh,buf,2)
  1681.                     byte_l:=buf[0]
  1682.                     byte_h:=buf[1]
  1683.                     r:=(Shr(byte_l,4) AND $F)*$1111
  1684.                     g:=(byte_h AND $F)*$1111
  1685.                     b:=(byte_l AND $F)*$1111
  1686.                     r:=(Shl(Shl(r,8),8) OR r)
  1687.                     g:=(Shl(Shl(g,8),8) OR g)
  1688.                     b:=(Shl(Shl(b,8),8) OR b)
  1689.                 ENDIF
  1690.                 IF palet[num].bit_per_pixel=24
  1691.                     Read(fh,buf,3)
  1692.                     r:=buf[0]
  1693.                     g:=buf[1]
  1694.                     b:=buf[2]
  1695.                     FOR loop:=0 TO 2
  1696.                         r:=Shl(r,8) OR r
  1697.                         g:=Shl(g,8) OR g
  1698.                         b:=Shl(b,8) OR b
  1699.                     ENDFOR
  1700.                 ENDIF
  1701.                 PutLong(palet[num].color[p]+(12*c),r)
  1702.                 PutLong(palet[num].color[p]+(12*c)+4,g)
  1703.                 PutLong(palet[num].color[p]+(12*c)+8,b)
  1704.             c:=c+1;ENDWHILE
  1705.         p:=p+1;ENDWHILE
  1706.         Close(fh)
  1707.     ENDIF
  1708. ENDPROC
  1709.  
  1710. PROC load_config_size(str)
  1711.     DEF p,mark,len
  1712.     check_str(str)
  1713.     p:=str
  1714.     mark,len:=scanforvalue(p)
  1715.     config_size_x:=bigger(mark,config_size_x)
  1716.     p:=p+len+1
  1717.     mark,len:=scanforvalue(p)
  1718.     config_size_y:=bigger(mark+barh+1,config_size_y)
  1719.     IF outwin
  1720.         StringF(string,'Environment (\d,\d)',config_size_x,config_size_y)
  1721.         SetWindowTitles(outwin,string,-1)
  1722.     ENDIF
  1723. ENDPROC
  1724.  
  1725. PROC load_config_set(num,str)
  1726.     DEF n,p:PTR TO CHAR,mark,len,x,y,i
  1727.     check_str(str)
  1728.     p:=str
  1729.     mark,len:=scanforvalue(p)
  1730.     p:=p+len+1
  1731.  
  1732.     pb[num]:=mark
  1733.  
  1734.     IF outwin
  1735.         StringF(string,'SET #\d uses Palette #\d ',num,mark)
  1736.         SetWindowTitles(outwin,string,-1)
  1737.     ENDIF
  1738.  
  1739.     n:=0;WHILE(n<MAX_CELL)
  1740.         IF p[0]<>"*"
  1741.             mark,len:=scanforvalue(p)
  1742.             p:=p+len+1
  1743.             x:=mark
  1744.             mark,len:=scanforvalue(p)
  1745.             p:=p+len+1
  1746.             y:=mark
  1747.             FOR i:=0 TO highcell
  1748.                 IF cell[i].mark=n
  1749.                     cell[i].setxy.x[num]:=x
  1750.                     cell[i].setxy.y[num]:=y
  1751.                 ENDIF
  1752.             ENDFOR
  1753.             WHILE ((p[0]=32) OR (p[0]=9) OR (p[0]=13));p:=p+1;ENDWHILE
  1754.         ELSE
  1755.             p:=p+1
  1756.             WHILE ((p[0]=32) OR (p[0]=9) OR (p[0]=13));p:=p+1;ENDWHILE
  1757.         ENDIF
  1758.     n:=n+1;ENDWHILE
  1759. ENDPROC
  1760.  
  1761. PROC planesclip(bm1,bm2,maxiw,maxih)
  1762.     DEF hap,hap2,sp1[8]:LIST
  1763.     IF ((bm1=0) OR (bm2=0)) THEN RETURN
  1764.     FOR hap:=0 TO 7
  1765.         sp1[hap]:=Long(bm1+8+(hap*4))
  1766.     ENDFOR
  1767.  
  1768.     FOR hap:=0 TO 7
  1769.         PutLong((bm1+8),sp1[hap])
  1770.         IF (((sp1[hap]>0)) AND ((hap+1)<=Char(bm1+5)))
  1771.             BltBitMap(bm1,0,0,bm2,0,0,maxiw,maxih,IF hap=0 THEN 192 ELSE 224,$1,0)
  1772.         ENDIF
  1773.     ENDFOR    
  1774.     FOR hap:=0 TO 7
  1775.         PutLong(bm1+8+(hap*4),sp1[hap])
  1776.     ENDFOR
  1777. ->    BltBitMap(bm2,0,0,bm2,0,0,maxiw,maxih,$50,$1,0)
  1778. ENDPROC
  1779.  
  1780. PROC flushproj()
  1781.     DEF i,t
  1782.     FOR i:=0 TO MAX_CELL-1
  1783.         IF ((cell[i].clip_pix<>0))
  1784.             PutChar(cell[i].clip_pix+5,1)
  1785.             FOR t:=1 TO 7;PutLong(cell[i].clip_pix+8+(t*4),0);ENDFOR
  1786.         ENDIF
  1787.         cache_cell(i,CACHE_NEED)
  1788.         IF cell[i].pix
  1789.             FreeBitMap(cell[i].pix)
  1790.             cell[i].pix:=0
  1791.         ENDIF
  1792.         IF cell[i].clip_pix
  1793.             FreeBitMap(cell[i].clip_pix)
  1794.             cell[i].clip_pix:=0
  1795.         ENDIF
  1796.         IF (cell[i].pix_rp)
  1797.             Dispose(cell[i].pix_rp)
  1798.             cell[i].pix_rp:=0
  1799.         ENDIF
  1800.         IF (cell[i].clip_pix_rp)
  1801.             Dispose(cell[i].clip_pix_rp)
  1802.             cell[i].clip_pix_rp:=0
  1803.         ENDIF
  1804.         cell[i].mark:=-2
  1805.         FOR t:=0 TO MAX_SET-1
  1806.             cell[i].setxy.x[t]:=0
  1807.             cell[i].setxy.y[t]:=0
  1808.             cell[i].setxy.set[t]:=50
  1809.         ENDFOR
  1810.         IF (cell[i].catch<>0)
  1811.             IF (cell[i].catchsize<>0)
  1812.                 FreeMem(cell[i].catch,cell[i].catchsize);cell[i].catch:=0
  1813.             ENDIF
  1814.         ENDIF
  1815.         cell[i].mark:=-66
  1816.         cell[i].fix:=0
  1817.         cell[i].xoffset:=0
  1818.         cell[i].yoffset:=0
  1819.         cell[i].xsize:=0
  1820.         cell[i].ysize:=0
  1821.         cell[i].cache:=0
  1822.     ENDFOR
  1823.     FOR i:=0 TO MAX_PAL-1
  1824.         FOR t:=0 TO MAX_SET-1
  1825.             IF palet[i].color[t]
  1826.                 Dispose(palet[i].color[t])
  1827.                 palet[i].color[t]:=0
  1828.             ENDIF
  1829.         ENDFOR
  1830.     ENDFOR
  1831.     FOR i:=0 TO MAX_SET-1
  1832.         pb[i]:=0
  1833.     ENDFOR
  1834.     highcell:=0
  1835. ENDPROC
  1836.  
  1837. PROC splitname(str1,str2,str3)
  1838.   DEF filestart,pathlen,stt[5]:STRING
  1839.     filestart:=FilePart(str1)
  1840.     pathlen:=filestart-str1
  1841.     IF pathlen
  1842.         StrCopy(str2,str1,pathlen)
  1843.         MidStr(stt,str2,StrLen(str2)-1,1)
  1844.         IF StrCmp(stt,'/',ALL)
  1845.             MidStr(str2,str2,0,StrLen(str2)-1)
  1846.         ENDIF        
  1847.         StrCopy(str3,filestart,ALL)
  1848.     ELSE
  1849.         StrCopy(str2,'',ALL)
  1850.         StrCopy(str3,str1,ALL)
  1851.     ENDIF
  1852. ENDPROC
  1853.  
  1854. PROC openscreen(d)
  1855.     DEF cflag,lflag1=CHECKIT,lflag2=CHECKIT,lflag3=CHECKIT,lflag4=CHECKIT,lflag5=CHECKIT,lflag=CHECKIT
  1856.     DEF hflag1=CHECKIT,hflag2=CHECKIT,hflag3=CHECKIT,bflag=CHECKIT
  1857.  
  1858.     lflag:=lflag OR MENUTOGGLE
  1859.     bflag:=bflag OR MENUTOGGLE
  1860.  
  1861.     depth:=d
  1862.     scr:=OpenScreenTagList(NIL,[SA_LIKEWORKBENCH,TRUE,
  1863.         SA_DEPTH,depth,
  1864.         SA_TITLE,'Play KiSS 0.88',
  1865.         SA_COLORMAPENTRIES,256,
  1866.         SA_FULLPALETTE,TRUE,
  1867.         SA_WIDTH,config_size_x,
  1868.         SA_HEIGHT,config_size_y,
  1869.         SA_INTERLEAVED,TRUE,
  1870.         SA_AUTOSCROLL,TRUE,
  1871.         SA_PENS,[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]:INT,
  1872.         IF (modeid>0) THEN SA_DISPLAYID ELSE $80000000,
  1873.             modeid,
  1874.         NIL,NIL])
  1875.     IF scr=0 THEN Raise("SCR")
  1876.     IF (vis:=GetVisualInfoA(scr,NIL))=0 THEN RETURN "VIS"
  1877.     win:=OpenWindowTagList(0,[WA_WIDTH,scr.width,WA_HEIGHT,scr.height-scr.barheight-1,
  1878.         WA_TOP,scr.barheight+1,WA_LEFT,0,
  1879.         WA_FLAGS,WFLG_ACTIVATE OR WFLG_SMART_REFRESH,
  1880.         WA_BORDERLESS,TRUE,
  1881.         WA_BACKDROP,TRUE,
  1882.         WA_CUSTOMSCREEN,scr,
  1883.         WA_NEWLOOKMENUS,TRUE,
  1884.         WA_IDCMP,IDCMP_MENUPICK OR IDCMP_MOUSEBUTTONS OR IDCMP_INTUITICKS OR IDCMP_MENUVERIFY OR IDCMP_MOUSEMOVE,
  1885.         NIL,NIL])
  1886.     IF win=0 THEN Raise("WIN")
  1887.     vp:=scr.viewport
  1888.     cm:=vp.colormap
  1889.     rp:=win.rport
  1890.  
  1891.     cflag:=CHECKIT
  1892.     IF (fixxed=0) THEN cflag:=cflag OR CHECKED
  1893.     IF (hand=TRUE)     THEN hflag2:=hflag2 OR CHECKED
  1894.     IF (hand=0)         THEN hflag1:=hflag1 OR CHECKED
  1895.     IF (hand=3)         THEN hflag3:=hflag3 OR CHECKED
  1896.     IF (waittof) THEN lflag:=lflag OR CHECKED
  1897.     IF (bound) THEN bflag:=bflag OR CHECKED
  1898.     SELECT rtdrag
  1899.     CASE DRAG_TOP;         lflag1:=lflag1 OR CHECKED
  1900.     CASE DRAG_PAUSE;    lflag2:=lflag2 OR CHECKED
  1901.     CASE DRAG_DIRTY;    lflag3:=lflag3 OR CHECKED
  1902.     CASE DRAG_BUFFER;    lflag4:=lflag4 OR CHECKED
  1903.     CASE DRAG_SMART;    lflag5:=lflag5 OR CHECKED
  1904.     ENDSELECT
  1905.   IF (menu:=CreateMenusA([NM_TITLE,0,'Project','P',0,0,0,
  1906.                                                     NM_ITEM,0,'Redraw Screen','R',0,0,4,
  1907.                                                     NM_ITEM,0,'Open','O',0,0,1,
  1908.                                                     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  1909.                                                     NM_ITEM,0,'Save As...','S',0,0,2,
  1910.                                                     NM_ITEM,0,NM_BARLABEL,0,0,0,0,
  1911.                                                     NM_ITEM,0,'About','?',0,0,3,
  1912.                                                     NM_ITEM,0,'Quit','Q',0,0,66,
  1913.  
  1914.                                                     NM_TITLE,0,'Item',0,0,0,0,
  1915.                                                     NM_ITEM,0,'Sets',0,0,0,0,
  1916.                                                     NM_SUB,0,'Set 0','A',CHECKIT OR CHECKED,%1111111110,30,
  1917.                                                     NM_SUB,0,'Set 1','B',CHECKIT,%1111111101,31,
  1918.                                                     NM_SUB,0,'Set 2','C',CHECKIT,%1111111011,32,
  1919.                                                     NM_SUB,0,'Set 3','D',CHECKIT,%1111110111,33,
  1920.                                                     NM_SUB,0,'Set 4','E',CHECKIT,%1111101111,34,
  1921.                                                     NM_SUB,0,'Set 5','F',CHECKIT,%1111011111,35,
  1922.                                                     NM_SUB,0,'Set 6','G',CHECKIT,%1110111111,36,
  1923.                                                     NM_SUB,0,'Set 7','H',CHECKIT,%1101111111,37,
  1924.                                                     NM_SUB,0,'Set 8','I',CHECKIT,%1011111111,38,
  1925.                                                     NM_SUB,0,'Set 9','J',CHECKIT,%0111111111,39,
  1926.  
  1927.                                                     NM_ITEM,0,'Palettes',0,0,0,0,
  1928.                                                     NM_SUB,0,'Palette 0','0',CHECKIT OR CHECKED,%1111111110,20,
  1929.                                                     NM_SUB,0,'Palette 1','1',CHECKIT,%1111111101,21,
  1930.                                                     NM_SUB,0,'Palette 2','2',CHECKIT,%1111111011,22,
  1931.                                                     NM_SUB,0,'Palette 3','3',CHECKIT,%1111110111,23,
  1932.                                                     NM_SUB,0,'Palette 4','4',CHECKIT,%1111101111,24,
  1933.                                                     NM_SUB,0,'Palette 5','5',CHECKIT,%1111011111,25,
  1934.                                                     NM_SUB,0,'Palette 6','6',CHECKIT,%1110111111,26,
  1935.                                                     NM_SUB,0,'Palette 7','7',CHECKIT,%1101111111,27,
  1936.                                                     NM_SUB,0,'Palette 8','8',CHECKIT,%1011111111,28,
  1937.                                                     NM_SUB,0,'Palette 9','9',CHECKIT,%0111111111,29,
  1938.  
  1939.                                                     NM_TITLE,0,'Settings',0,0,0,0,
  1940.                                                     NM_ITEM,0,'Screen Boundaries?',0,bflag,0,77,
  1941.  
  1942.                                                     NM_ITEM,0,'Drag Strength',0,0,0,0,
  1943.                                                     NM_SUB,0,'0',0,CHECKIT,%1111111110,100,
  1944.                                                     NM_SUB,0,'1',0,                CHECKIT,%1111111101,101,
  1945.                                                     NM_SUB,0,'2',0,                CHECKIT,%1111111011,102,
  1946.                                                     NM_SUB,0,'3',0,                CHECKIT,%1111110111,103,
  1947.                                                     NM_SUB,0,'4',0,                CHECKIT,%1111101111,104,
  1948.                                                     NM_SUB,0,'5',0,                CHECKIT,%1111011111,105,
  1949.                                                     NM_SUB,0,'6',0,                CHECKIT,%1110111111,106,
  1950.                                                     NM_SUB,0,'7',0,                CHECKIT,%1101111111,107,
  1951.                                                     NM_SUB,0,'8',0,                CHECKIT,%1011111111,108,
  1952.                                                     NM_SUB,0,'9',0,                CHECKIT,%0111111111,109,
  1953.  
  1954.                                                     NM_ITEM,0,'Pointer',0,0,0,0,
  1955.                                                     NM_SUB,0,'Normal',0,hflag1,    %110,76,
  1956.                                                     NM_SUB,0,'Hand',0,hflag2,        %101,78,
  1957.                                                     NM_SUB,0,'Blank',0,hflag3,    %011,79,
  1958.  
  1959.                                                     NM_ITEM,0,'Drag Type',0,0,0,0,
  1960.                                                     NM_SUB,0,'Always on top',                        0,lflag1,%11110,80,
  1961.                                                     NM_SUB,0,'Layered, on pause',                0,lflag2,%11101,81,
  1962.                                                     NM_SUB,0,'Layered, quick&dirty',        0,lflag3,%11011,82,
  1963.                                                     NM_SUB,0,'Layered, buffered',                0,lflag4,%10111,83,
  1964.                                                     NM_SUB,0,'Layered, smart buffered',    0,lflag5,%01111,84,
  1965.                                                     NM_SUB,0,NM_BARLABEL,0,0,0,0,
  1966.                                                     NM_SUB,0,'Wait for blitter?',0,lflag,0,89,
  1967.  
  1968.                                                     NM_END,0,'End','x',0,0,0]:newmenu,NIL))=NIL THEN Raise("MENU")
  1969.     LayoutMenusA(menu,vis,[GTMN_NEWLOOKMENUS,TRUE,NIL,NIL])
  1970.     SetMenuStrip(win,menu)
  1971. ENDPROC
  1972.  
  1973. PROC closescreen()
  1974.     IF win
  1975.         CloseWindow(win)
  1976.         win:=0
  1977.     ENDIF
  1978.     IF menu
  1979.         FreeMenus(menu)
  1980.         menu:=0
  1981.     ENDIF
  1982.     IF vis
  1983.         FreeVisualInfo(vis)
  1984.         vis:=0
  1985.     ENDIF
  1986.     IF scr
  1987.         CloseScreen(scr)
  1988.         scr:=0
  1989.     ENDIF
  1990.  
  1991. ENDPROC
  1992.  
  1993. PROC retdepth(m)
  1994.     SELECT m
  1995.     CASE 0;RETURN 4
  1996.     CASE 1;RETURN 4
  1997.     CASE 2;RETURN 5
  1998.     CASE 3;RETURN 6
  1999.     CASE 4;RETURN 6
  2000.     CASE 5;RETURN 7
  2001.     CASE 6;RETURN 7
  2002.     CASE 7;RETURN 7
  2003.     CASE 8;RETURN 7
  2004.     ENDSELECT
  2005. ENDPROC 8
  2006.  
  2007. PROC smaller(val1,val2);IF val1<val2;RETURN val1;ELSE;RETURN val2;ENDIF;ENDPROC
  2008. PROC bigger(val1,val2);IF val1>val2;RETURN val1;ELSE;RETURN val2;ENDIF;ENDPROC
  2009. PROC limit(val1,val2,val3);IF val1<val2 THEN RETURN val2
  2010.             IF val1>val3 THEN RETURN val3;ENDPROC val1
  2011.  
  2012.  
  2013. hand1bm:
  2014.     INT    2,22
  2015.     CHAR    0,2
  2016.     INT    0
  2017.     LONG    0,0,0,0,0,0,0,0
  2018.  
  2019. hand2bm:
  2020.     INT    2,22
  2021.     CHAR    0,2
  2022.     INT    0
  2023.     LONG    0,0,0,0,0,0,0,0
  2024.  
  2025. hand3bm:
  2026.     INT    2,1
  2027.     CHAR    0,2
  2028.     INT    0
  2029.     LONG    0,0,0,0,0,0,0,0
  2030.  
  2031.  
  2032. hand1dataa:
  2033.     LONG    $03000380,$03800380,$038003e0,$03f00368,$c37ae3ef,$73fb3fff
  2034.     LONG    $1fff0fff,$0fff07ff,$07fe03fe,$03f803f8,$01f80000
  2035. hand1datab:
  2036.     LONG    $00000080,$00800080,$00800080,$00900090,$00840011,$00050001
  2037.     LONG    $00010001,$00010003,$0002000e,$00080008,$01f80000
  2038.  
  2039. hand2dataa:
  2040.     LONG    $00000000,$00000300,$038003e0,$03f00b68,$1f7a1bef,$1ffb1fff
  2041.     LONG    $1fff0fff,$0fff07ff,$07fe03fe,$03f803f8,$01f80000
  2042. hand2datab:
  2043.     LONG    $00000000,$00000000,$00800080,$04900490,$00840411,$00050001
  2044.     LONG    $00010001,$00010003,$0002000e,$00080008,$01f80000
  2045.  
  2046. hand3dataa:
  2047.     LONG %10000000000000000000000000000000
  2048.     LONG %00000000000000000000000000000000
  2049. hand3datab:
  2050.     LONG %10000000000000000000000000000000
  2051.     LONG %00000000000000000000000000000000
  2052.